preg_match不在html标记内部或之间的文本

时间:2017-07-26 02:24:32

标签: php regex preg-replace

我在wordpress上有一个博客,我正在努力改善内部链接。我有一个带有关键词的l csv和我要链接到那些关键词的关联页面。我做的是拉wp_posts表并编写一个脚本来遍历帖子的内容,并匹配页面上每个关键词的第一次出现并用链接包装。这很有效,除了它匹配标题和其他链接中的单词。当时没什么问题需要解决,因为我只有30个帖子来浏览和清理。现在我想再次这样做,但我有500个帖子。我用来匹配第一次出现的函数是:

function str_replace_first($from, $to, $subject) {
    $from = '/(\s|\")('.preg_quote($from, '/').')(s|es|d|ed)?(\s|\,|\.|\:|\;|\'|\"|\!)/i';
    $from = str_replace(' ', '\s', $from);
    return preg_replace($from, '$1' . '<a href="http://www.heropay.com/glossary/' . $to . '">$2$3</a>$4', $subject, 1);
}  

该函数接受我正在寻找的单词并将其包装在正则表达式中。正则表达式正在寻找一个跟随并由白色空格或标点符号继续的单词。我需要扩展此正则表达式以匹配标记中的文本(如图像的alt文本中的单词)或两个标记之间的文本(如2个H2标记之间的中间单词)。例如:

<h1>Some text here</h1>
<img src="http://example.com/img/text.png" alt="Some text here" />
 some more text here.

在上面的HTML中,如果我想要链接的术语是&#34; text&#34;该函数应该返回:

<h1>Some text here</h1>
<img src="http://example.com/img/text.png" alt="Some text here" />
 some more <a href="http://example.com/text">text</a> here.

它会跳过&#34;文本&#34;在图像的h1和alt标签中。我尝试将匹配的正则表达式修改为:

/[^<(.+?)[\s]*\/?[\s]*>]?(\s|\")('.preg_quote($from, '/').')(s|es|d|ed)?(\s|\,|\.|\:|\;|\'|\"|\!)[^<(.+?)[\s]*\/?[\s]*>]?/i

这会尝试捕获html标签,但这似乎不起作用。

0 个答案:

没有答案