如何使用 preg_replace 和 preg_quote 处理字符串(不区分大小写)?
Posted
技术标签:
【中文标题】如何使用 preg_replace 和 preg_quote 处理字符串(不区分大小写)?【英文标题】:How to process a string with preg_replace and preg_quote (case insensitive)? 【发布时间】:2019-10-21 23:55:42 【问题描述】:我有一条短信:
Curabitur nec bibendum erat。 sed a scelerisque arcu, facilisis 莫里斯双比登。 Mauris sed sed sapien volutpat, volutpat risus in, bibendum odio。前庭 eget neque a lorem CURABITUR rhoncus。 Aenean mollis ipsum ut facilisis egestas。 Pellentesquefinibus sed 前eget interdum。 Nunc fringilla ante a egestas mattis。赛德 tincidunt libero a dapibus bibendum。 Morbi ac sapien 车辆, 调味品justo eget,curabitur nisl。 Cras rutrum molestie 直径, ac maximus mauris auctor quis。 Ut vel diam nunc。 Aliquam auctor, 麦格纳 发酵菌,orci libero consectetur magna,id scelerisque Tellus sem et orci.
在 php 中,我想用标签 <mark>
包裹“curabitur”这个词,就像 <mark>$1</mark>
使用不敏感的大小写一样。
以下代码有效:
return preg_replace("/(" . $needle . ")/mi", "<mark>$1</mark>", $haystack );
输出:
Curabitur nec bibendum erat。 sed a scelerisque arcu, facilisis 莫里斯双比登。 Mauris sed sed sapien volutpat, volutpat risus in, bibendum odio。 Vestibulum eget neque a lorem CURABITUR rhoncus。埃涅阿 mollis ipsum ut facilisis egestas。 Pellentesque finibus sed ante eget 中间体。 Nunc fringilla ante a egestas mattis。 Sed tincidunt libero a dapibus bibendum。 Morbi ac sapien vehicula, condimentum justo eget, curabitur nisl。 Cras rutrum molestie diam, ac maximus mauris auctor 测验。 Ut vel diam nunc。 Aliquam auctor, magna ac finibus infantum, orci libero consectetur magna, id scelerisque tellus sem et orci。
但是如果你有这个文本:
[Curabitur] nec bibendum erat。 sed a scelerisque arcu, facilisis 莫里斯双比登。 Mauris sed sed sapien volutpat, volutpat risus in, bibendum odio。前庭 eget neque a lorem [CURABITUR] rhoncus。埃涅阿 mollis ipsum ut facilisis egestas。 Pellentesque finibus sed ante eget 中间体。 Nunc fringilla ante a egestas mattis。 Sed tincidunt libero a dapibus bibendum。 Morbi ac sapien vehicula, condimentum justo eget, [curabitur] 尼斯尔。 Cras rutrum molestie diam, ac maximus mauris auctor 测验。 Ut vel diam nunc。 Aliquam auctor, magna ac finibus infantum, orci libero consectetur magna, id scelerisque tellus sem et orci。
和$needle = [curabitur]
你应该使用preg_quote()
转义字符[
,]
但以下操作不起作用:
return preg_replace("/(" . preg_quote( $needle ) . ")/mi", "<mark>$1</mark>", $haystack );
因为$1
被preg_quote()
修改了。
我该如何解决这个问题?
【问题讨论】:
你说的$1
被preg_quote()
修改是什么意思?它被修改,以便正则表达式引擎可以将其解析为文字文本。您没有任何问题需要解决。
【参考方案1】:
刚刚在没有 preg_quote 的情况下测试了它,但使用了你想要的针,它就像一个魅力:
$haystack = "[Curabitur] nec bibendum erat. Sed a scelerisque arcu, facilisis bibendum mauris. Mauris sed sapien volutpat, volutpat risus in, bibendum odio. Vestibulum eget neque a lorem CURABITUR rhoncus. Aenean mollis ipsum ut facilisis egestas. Pellentesque finibus sed ante eget interdum. Nunc fringilla ante a egestas mattis. Sed tincidunt libero a dapibus bibendum. Morbi ac sapien vehicula, condimentum justo eget, curabitur nisl. Cras rutrum molestie diam, ac maximus mauris auctor quis. Ut vel diam nunc. Aliquam auctor, magna ac finibus fermentum, orci libero consectetur magna, id scelerisque tellus sem et orci.";
$needle = "curabitur";
echo preg_replace("/(\[" . $needle . "\])/mi", "<mark>$1</mark>", $haystack );
结果是:
<mark>[Curabitur]</mark>
nec bibendum 时代。 Sed一个scelerisque弧形, facilisis bibendum mauris。 Mauris sed sed sapien volutpat, volutpat risus 在,必比登奥迪奥。前庭 eget neque a lorem CURABITUR rhoncus。 Aenean mollis ipsum ut facilisis egestas。 Pellentesquefinibus sed 前eget interdum。 Nunc fringilla ante a egestas mattis。赛德 tincidunt libero a dapibus bibendum。 Morbi ac sapien 车辆, 调味品justo eget,curabitur nisl。 Cras rutrum molestie 直径, ac maximus mauris auctor quis。 Ut vel diam nunc。 Aliquam auctor, 麦格纳 发酵菌,orci libero consectetur magna,id scelerisque Tellus sem et orci.
我只是用反斜杠 \[
转义了括号(参见示例,这基本上是 preg_quote()
应该做的。
然后我尝试了:
$needle = preg_quote("[curabitur]");
echo preg_replace("/(" . $needle . ")/mi", "<mark>$1</mark>", $haystack );
QED。它就像一个魅力。你的问题不存在,代码有效。
【讨论】:
是的,它有效。问题出在之前的治疗期间。对不起。以上是关于如何使用 preg_replace 和 preg_quote 处理字符串(不区分大小写)?的主要内容,如果未能解决你的问题,请参考以下文章
preg_replace、preg_replace_callback 和数组到字符串的转换