我有一条短信:
古怪的新书架。塞德·塞克斯(Sed) Bibendum毛里斯。毛里斯(Mauris sed sapien volutpat), Bibendum dioo。 Vestibulum eget串成一头苍蝇CURABITUR菱形。 埃涅尔州mollis ipsum ut facilisis egestas佩伦特斯克·菲尼布斯·塞德 事前达成共识。 Nunc fringilla ante a egestas mattis。塞德 Tincidunt libero a dapibus bibendum。 Morbi ac sapien vehicula, 调味品,调味品。 Cras rutrum molestie diam,交流 马克西姆斯·毛里斯·奥克斯·奎斯Ut vel diam nunc。 Magna AC Aliquam打印机 finibus fermentum,神圣的奥尔西·利贝罗·康纳斯特,id Tellus sem et orci。
在PHP中,我希望使用不敏感的大小写形式将{curlatur“像标签<mark>
一样包裹在标签<mark>$1</mark>
上。
以下代码有效:
return preg_replace("/(" . $needle . ")/mi", "<mark>$1</mark>", $haystack );
输出:
古怪动物 nec bibendum erat。塞德·塞克斯(Sed) Bibendum毛里斯。毛里斯(Mauris sed sapien volutpat), Bibendum dioo。 Vestibulum eget勾勒出 CURABITUR 菱形。艾尼安 mollis ipsum ut facilisis egestas。 Pellentesque finibus sed ante eget 演练。 Nunc fringilla ante a egestas mattis。塞德·廷奇敦·利贝罗 达比布斯双峰。 Morbi ac sapien vehicula,调味品, 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 scelerisquetellus sem et orci。
但是如果您有以下文字:
[Curabitur]全新书架。塞德·塞克斯(Sed) Bibendum毛里斯。毛里斯(Mauris sed sapien volutpat), Bibendum dioo。 Vestibulum eget串成黑斑病[CURABITUR]菱形。艾尼安 mollis ipsum ut facilisis egestas。 Pellentesque finibus sed ante eget 演练。 Nunc fringilla ante a egestas mattis。塞德·廷奇敦·利贝罗 达比布斯双峰。 Morbi ac sapien vehicula,调味品, [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 scelerisquetellus sem et orci。
和$needle = [curabitur]
,您应该使用preg_quote()
来转义字符[
,]
但是,以下操作不能起作用:
return preg_replace("/(" . preg_quote( $needle ) . ")/mi", "<mark>$1</mark>", $haystack );
因为$1
被preg_quote()
修改了。
我该如何解决?
答案 0 :(得分:0)
仅在不使用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>
全新书架。塞了一个天才的弓箭手, facilisis bibendum mauris。毛里斯·塞德·萨皮恩·沃尔图帕特 在,bibendum dioo。 Vestibulum eget串成一头苍蝇CURABITUR菱形。 埃涅尔州mollis ipsum ut facilisis egestas佩伦特斯克·菲尼布斯·塞德 事前达成共识。 Nunc fringilla ante a egestas mattis。塞德 Tincidunt libero a dapibus bibendum。 Morbi ac sapien vehicula, 调味品,调味品。 Cras rutrum molestie diam,交流 马克西姆斯·毛里斯·奥克斯·奎斯Ut vel diam nunc。 Magna AC Aliquam打印机 finibus fermentum,神圣的奥尔西·利贝罗·康纳斯特,id Tellus sem et orci。
我只是用反斜杠\[
转义了括号(请参见示例,这基本上是preg_quote()
应该做的。
然后我尝试了:
$needle = preg_quote("[curabitur]");
echo preg_replace("/(" . $needle . ")/mi", "<mark>$1</mark>", $haystack );
QED。它像一种魅力。您的问题不存在,代码有效。