【问题标题】:PHP script with regular expressions带有正则表达式的 PHP 脚本
【发布时间】:2010-10-14 03:28:32
【问题描述】:

我正在尝试使用以下 php 脚本获取标题标签之间的文本:

$search_string= < h1 >testing here< /h1 >;

$text = preg_match('<%TAG%[^>]*>(.*?)</%TAG%>',$search_string, $matches);

echo $matches[0]; 

当我尝试运行此脚本时,没有返回任何值。相反,有警告消息: 警告:preg_match() [function.preg-match]: Unknown modifier '(' in C:\xampp\htdocs\check_for_files.php on line 10

有人可以帮忙吗?

【问题讨论】:

  • 参见 [RegEx 匹配开放标签,XHTML 自包含标签除外](stackoverflow.com/questions/1732348/…)。
  • 没错,你会想在你的表达式中使用一个真实的标签名称(例如'h1'),并且引用你的 $search_string 也会有所帮助。

标签: php regex preg-match


【解决方案1】:

你的表达需要delimiters/ 是最常见的,但# 应该适用于这种情况。

$text = preg_match('#<%TAG%[^>]*>(.*?)</%TAG%>#',$search_string, $matches);

【讨论】:

    【解决方案2】:

    警告是因为您没有将正则表达式括在分隔符中。所以试试

    $text = preg_match('#<%TAG%[^>]*>(.*?)</%TAG%>#',$search_string, $matches);
    

    了解警告。

    考虑你的正则表达式:

    '<%TAG%[^>]*>(.*?)</%TAG%>'
     ^          ^
    start      end 
    

    由于您没有明确地将正则表达式放在分隔符之间,PHP 认为您正在使用 &lt;&gt; 作为分隔符,因为 &lt; 是正则表达式中的第一个字符。因此,当它看到未转义的 &lt; 时,会将其视为模式的结尾。接下来,我们可以在结束分隔符之后添加一些修饰符,这允许我们改变模式匹配的行为。一些常见的修饰符是:

    • i 不区分大小写
    • m 用于多行匹配

    现在在您的情况下,在结束分隔符之后有一个 (,它不是有效的修饰符,因此是警告。

    【讨论】:

      【解决方案3】:

      /^&lt;[^&gt;]+&gt;(.*)&lt;\/[^&gt;]+&gt;$/ 应该可以解决问题。

      【讨论】:

      • 嗨,我对这种方法很感兴趣。你能解释一下吗?谢谢。
      • 这是一个非常基本的表达方式; &lt;[^&gt;]+&gt; 表示'一个或多个除&gt; 之外的任何字符,包含在&lt;&gt; 中; (.*) 匹配任何东西;和&lt;\/[^&gt;]+&gt; 与第一个相似,因为它表示'一个或多个除&gt; 之外的任何字符,包含在&lt;/&gt; 中。第一个和最后一个以这种方式构造,因此您不必编写复杂的规则来匹配标签中可能存在的内容(属性等);我们假设&gt; 不会在其中(例如,因为这在类名或元素 ID 中无效)。不是最有效的表达方式,但可以完成工作。
      • 另外:.* 周围有括号(例如,(.*)),以便该组作为结果中的特定匹配项返回。
      猜你喜欢
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 2015-01-17
      • 2021-09-28
      相关资源
      最近更新 更多