Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 带边界查询的正则表达式_Php_Regex - Fatal编程技术网

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>是大写的(即<代码>迪士尼< /代码>),或者甚至在字符串的开头或结尾使用。为什么要在单词前加句号?在单词前加空格或句号(在字符类中不需要转义)?为什么要在单词前面加一个句号?