Php 仅当某些单词不在其前面时,字符串中的粗体字

Php 仅当某些单词不在其前面时,字符串中的粗体字,php,regex,Php,Regex,我有一根这样的绳子 $dot_prod = "at the coast will reach the Douglas County coast"; 我希望通过使用正则表达式得到这个结果:在海岸将到达道格拉斯县海岸 具体来说,我想加粗“coast”和“the”,但如果前面没有“country”,则仅加粗“coast”,如果前面没有“at”,则仅加粗“the”。因此,本质上我希望一组单词或短语(不区分大小写,保留单词/短语原来的大小写)以粗体显示,然后一组我希望确保不以粗体显示的单词或短语。例如,

我有一根这样的绳子

$dot_prod = "at the coast will reach the Douglas County coast";
我希望通过使用正则表达式得到这个结果:在海岸将到达道格拉斯县海岸

具体来说,我想加粗“coast”和“the”,但如果前面没有“country”,则仅加粗“coast”,如果前面没有“at”,则仅加粗“the”。因此,本质上我希望一组单词或短语(不区分大小写,保留单词/短语原来的大小写)以粗体显示,然后一组我希望确保不以粗体显示的单词或短语。例如,我想要加粗的单词/短语数组是:

$bold = array("coast", "the", "pass");
$unbold = array("county coast", "at the", "grants pass");
我要确保未绑定的单词数组是:

$bold = array("coast", "the", "pass");
$unbold = array("county coast", "at the", "grants pass");
我能用这个做粗体字:

$bold = array("coast", "the", "pass");

$dot_prod = preg_replace("/(" . implode("|", $bold) . ")/i", "<b>$1</b>", $dot_prod);
$bold=数组(“海岸”、“方向”、“通行证”);
$dot_prod=preg_replace(“/(”。内爆(“|”),$bold)。”/i“,“$1”,$dot_prod);

然而,后来我在解绑方面失败了,我肯定不知道如何在一个表达式中完成这一切。你能帮忙吗?谢谢。

您可以匹配或跳过要“取消绑定”的模式,并在任何其他上下文中匹配要加粗的模式

像这样构建一个正则表达式(我添加了单词边界以匹配整个单词,您可能不必使用它们,但这对于您当前的输入似乎是一个好主意):

详细信息

  • \b
    -单词边界
  • (?:县海岸|在|授予通行证处)
    -任何备选方案
  • \b
    -单词边界
  • (*SKIP)(*F)
    -用于跳过当前匹配并从当前匹配结束处继续查找匹配的PCRE谓词
  • |
    -或
  • \b
    -单词边界
  • (?:滑行|通行证)
    -任何备选方案
  • \b
    -单词边界
替换中的
$0
是对整个匹配值的引用

:


如果这些物品可能包含特殊的正则表达式元字符,也可以在其上使用
preg_quote

要成为你这个级别的正则表达式大师必须做些什么?@利润我在这里已经有4年了,正则表达式标签,每天。@WiktorStribiżew,非常感谢!这很有效。如果你有时间,你能再解释一下正则表达式的顺序吗?它的工作原理是这样的,如果它匹配第一组短语中的一个,那么它会忽略下一组吗?这就是SKIP F所做的吗?只是想更好地把握。再次感谢@user1610717您可以阅读关于regex中替代顺序的重要性。如果您的搜索词仅由单词字符组成,则只需
\b
单词边界即可。空格会使
\b
单词边界无效,因此在这里您应该小心。至于
SKIP-FAIL
技术,它是。
usort($unbold, function($a, $b) { return strlen($b) - strlen($a); });
usort($bold, function($a, $b) { return strlen($b) - strlen($a); });