Php 带边界查询的正则表达式
我在我的数据中找到某些单词,并用锚定标记替换这些关键字 关键词:迪斯尼 数据:Php 带边界查询的正则表达式,php,regex,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">disne
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
有人能面对这类问题吗?你想确保迪士尼本身就是一个词。下面是我使用的正则表达式:
[\s\.]disney[\s\.$]
下面是我如何测试它的:
您要确保迪士尼本身就是一个单词。下面是我使用的正则表达式:
[\s\.]disney[\s\.$]
下面是我如何测试它的:
使用\s而不是\b
/\sdisney\s/i
\b表示单词边界,包括“-”作为匹配字符
使用\s而不是\b
/\sdisney\s/i
\b表示单词边界,包括“-”作为匹配字符
您的逻辑是合理的,但在您的案例中,单词边界是不够的。您可以看到
\bdisney\b
匹配-disney-(为什么不应该?)对于您的示例,我在匹配的单词后面添加了一些空格:
$result = preg_replace('/\s+(disney)\s+/', '<a href="/test.php">$1</a>', $subject);
$result=preg_replace('/\s+(disney)\s+/',''.$subject);
虽然这对本例有效,但可能还不够。例如,它不适用于迪斯尼。您可以根据需要修改它。您的逻辑是正确的,但在您的情况下,单词边界是不够的。您可以看到
\bdisney\b
匹配-disney-(为什么不应该?)对于您的示例,我在匹配的单词后面添加了一些空格:
$result = preg_replace('/\s+(disney)\s+/', '<a href="/test.php">$1</a>', $subject);
$result=preg_replace('/\s+(disney)\s+/',''.$subject);
虽然这对本例有效,但可能还不够。例如,它不适用于迪斯尼。您可以根据需要修改它。我认为这可能会起作用:
preg_replace("#(?:\s|\A)(disney)(?:\s|\z)#m", "<a>\1</a>", $text);
preg#u replace(“#(?:\s |\A)(迪士尼)(?:\s |\z)#m”、“\1”、$text);
我认为这可能有效:
preg_replace("#(?:\s|\A)(disney)(?:\s|\z)#m", "<a>\1</a>", $text);
preg#u replace(“#(?:\s |\A)(迪士尼)(?:\s |\z)#m”、“\1”、$text);
你必须更清楚地表达你的愿望。什么时候应该替换子字符串?您必须更清楚地表达您的愿望。什么时候应该替换子字符串?在表达式的开头和结尾使用所需的空格(不是单词字符),\b
断言在技术上是多余的,但不会造成太大伤害。移除它们会稍微提高效率。需要考虑的两个更重要的例子是:<代码>迪士尼<代码>是大写的(即<代码>迪士尼< /代码>),或者甚至在字符串的开头或结尾使用。在表达式的开始和结束时所需的空白(不是单词字符),<代码> \b/COD>断言在技术上是多余的,但不是非常有害。移除它们会稍微提高效率。需要考虑的两个更重要的例子是:<代码>迪士尼< /Cl>是大写的(即<代码>迪士尼< /代码>),或者甚至在字符串的开头或结尾使用。为什么要在单词前加句号?在单词前加空格或句号(在字符类中不需要转义)?为什么要在单词前面加一个句号?