【问题标题】:Regular Expression Works In One Script and Doesn't In Another正则表达式在一个脚本中有效,在另一个脚本中无效
【发布时间】:2009-09-07 07:36:02
【问题描述】:

我在 PHP 中偶然发现了一个有趣的错误。基本上,我在下面看到了一个正则表达式,它在一个脚本(脚本 A)中工作正常,但在放入类并在脚本(脚本 B)中使用时无法工作。

我已经在 PHP 5.3 和 5.2 上测试过这个脚本。

脚本 A:
http://iamdb.googlecode.com/svn/trunk/testing.php

脚本 B:
使用正则表达式的类:http://iamdb.googlecode.com/svn/trunk/imdb/search/imdb_search_title.class.php
调用它的脚本:http://iamdb.googlecode.com/svn/trunk/examples/Search_Debug.php

正则表达式:

"#<br> aka <em>\"([^\"]*)\"</em>(?: -?,? ([^ ]*) (?:<em>\(([^\)]*)\)</em>)*)*#i"

谢谢。

根据要求,这里是脚本 B 的一些示例输出...

Array
(
    [0] => Array
        (
        )

    [1] => Array
        (
        )

    [2] => Array
        (
        )

    [3] => Array
        (
        )

    [INPUT] => <small>(TV series)</small>    <br>aka <em>"Hammer Time"</em> - USA <em>(working title)</em>
)

编号键来自 preg_match_all 调用,之后添加 INPUT 键以显示输入字符串。

【问题讨论】:

  • 什么意思,无法工作?调用类成员的输入输出是什么?
  • 附带说明,尝试使用正则表达式解析 XML/HTML 是个坏主意。
  • 您提供了许多引人注目的选择。
  • 我觉得骂人不太合适。

标签: php regex


【解决方案1】:

查看调试器,preg_replace_alls 的 主题 在类和 test.php 案例之间不匹配。

来自测试用例:

<small>(TV series)</small>    <br> aka <em>"Sledge Hammer: The Early Years"</em> - USA <em>(second season title)</em>

从类中调用时的实际主题

<small>(TV series)</small>    <br>aka <em>"Hammer Time"</em> - USA <em>(working title)</em>

&lt;br&gt;aka 之间没有空格。从正则表达式中取出那个空间,它就可以工作了。

【讨论】:

    【解决方案2】:

    正则表达式或将其嵌入类中没有任何问题。你说服自己你的测试情况是等价的,而实际上它们不是。在直接情况下,您发送的类版本的字符串,

    <small>(TV series)</small>    <br>aka <em>"Hammer Time"</em> - USA <em>(working title)</em>
    

    与正则表达式不匹配,因为正则表达式在&lt;br&gt;aka 之间需要一个空格。它的这个版本有效:

    const REGEX_AKA = "#<br>\s*aka <em>\"([^\"]*)\"</em>(?: (?:-?)(?:,?) ([^ ]*) (?:<em>\(([^\)]*)\)</em>)*)*#i";
    

    【讨论】:

      【解决方案3】:

      您是否尝试匹配 IMDB 上的实际搜索结果页面,例如 this one?在该页面上,"&lt;br&gt;""aka" 始终由实体引用分隔,以获取不间断空格:

      <br>&#160;aka <em>
      

      我不知道是否总是这样;您可能希望允许 whitepsace 的多种类型和表示形式,如下所示:

      <br>(?:&(?:#(?:160|xA0)|nbsp);|\xA0|\s)*+aka
      

      即零个或多个:NBSP 的实体引用(十进制、十六进制或命名);一个真正的 NBSP;或标准的空白字符。

      【讨论】:

      • 是的,我在运行正则表达式之前解码了 HTML 实体。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多