带边界查询的正则表达式

时间:2011-11-03 14:03:34

标签: php regex

我在数据中找到某些字词,并用锚标记替换这些关键字。

例如。关键字:迪士尼

数据:

This is temp data -disney-movie-deaths.html nightmare some more text disney This is some more data.

我想将其转换为:

This is temp data -disney-movie-deaths.html nightmare some more text <a href="/test.php">disney</a> This is some more 

我使用regx作为:/\bdisney\b/i

但问题在于它将其转换为:

This is temp data -<a href="/test.php">disney</a>-movie-deaths.html nightmare some more text disney This is some more 

有人可以面对这类问题吗?

4 个答案:

答案 0 :(得分:2)

使用\ s而不是\ b

/\sdisney\s/i

\ b表示单词边界,并包含“ - ”作为匹配字符

http://www.regular-expressions.info/wordboundaries.html

答案 1 :(得分:2)

您的逻辑是合理的,但在您的情况下,字边界是不够的。您看到\bdisney\b匹配-disney-(为什么不应该?)对于您的示例,我在您匹配的单词后面和后面添加了一些空格:

$result = preg_replace('/\s+(disney)\s+/', '<a href="/test.php">$1</a>', $subject);

虽然这适用于此示例,但它可能还不够。例如,它不适用于disney.您可以根据需要进行修改。

答案 2 :(得分:0)

您希望确保disney本身就是一个单词。这是我使用的正则表达式:

[\s\.]disney[\s\.$]

这是我测试它的方式:

http://rubular.com/r/YyZMeGITJY

答案 3 :(得分:0)

我认为这可行:

preg_replace("#(?:\s|\A)(disney)(?:\s|\z)#m", "<a>\1</a>", $text);