将其他匹配项添加到preg_replace_callback模式

时间:2018-09-07 02:42:28

标签: php wordpress pattern-matching

我正在编辑Wordpress脚本,该部分从链接中排除了H标签之间的帖子中的任何内容。我想确保某些类或标签之间的其他内容也未链接。

因此当前代码将仅在h标签之间包含任何内容 但我需要它也可以匹配figcaption之间的任何内容 标签。但我不想匹配喜欢p标签等的对象。

该脚本正在添加词汇表中的链接,我不希望它链接标题和标题。我在想我需要另一个表达式,以便它与OR b匹配。

这是字幕HTML的示例

    <figcaption class="wp-caption-text">Anfisa prepares to</figcaption>

此后,我尝试了此操作:

((<figcaption.*>)(.*)(</figcaption>)|(<h.*?>)(.*?)(</h.*?>))

但是,这似乎只是匹配其中一个的第一个实例,然后停止。 谢谢!

if ($options['excludeheading'] == "on") {

    $text = preg_replace_callback('%(<h.*?>)(.*?)(</h.*?>)%si', function($m) { 
    return $m[1].SEOAutoReSpecChar($m[2]).$m[3];
},
$text

    ...

1 个答案:

答案 0 :(得分:0)

通常,您不应使用正则表达式来解析HTML内容,尤其是在嵌套HTML内容的情况下。相反,您应该使用PHP提供的某种类型的解析器。但是,如果您想用当前的方法找到确切的解决方案,我们可以尝试在匹配开始标签的同时捕获标签的文本。然后,再匹配相同的结束标记。

$text = "<figcaption>blah</figcaption>";
$text = preg_replace_callback('%<([^>]+)>(.*?)</\1>%si', function($m) { 
    return $m[2];                         //   ^^^^ backreference
}, $text);
echo "The following text is contained within a single level HTML tag: " . $text;

Demo