Php 术语表替换的正则表达式

Php 术语表替换的正则表达式,php,regex,preg-replace,Php,Regex,Preg Replace,我正在编写词汇表模块-它必须找到文本中的已知单词,并用链接替换它。如果是链接ancor()或属性(…),则不能替换word 我编写了以下代码: $x = '<div>DVB-S2. DVB-S. DVB-S2DVB-S <sss DVB-S2 /> DVB-S2 <a href="dd">DVB-S2</a> DVB-S2 Hot bird 6/Hot Bird 8/Hot bird 9, 13.0</div>'; $word = '

我正在编写词汇表模块-它必须找到文本中的已知单词,并用链接替换它。如果是链接ancor(
)或属性(
),则不能替换word

我编写了以下代码:

$x = '<div>DVB-S2. DVB-S. DVB-S2DVB-S <sss DVB-S2 /> DVB-S2 <a href="dd">DVB-S2</a> DVB-S2 Hot bird 6/Hot Bird 8/Hot bird 9, 13.0</div>';

$word = 'Hot Bird 8';
$x = preg_replace("'(?<=[\s\>])(" . $word . ")(?=[^\d\w\-])(?!([^<]+)?>)'is", "<a href=\"s2\">$1</a>", $x);

$word = 'DVB-S2';
$x = preg_replace("'(?<=[\s\>])(" . $word . ")(?=[^\d\w\-])(?!([^<]+)?>)'is", "<a href=\"s2\">$1</a>", $x);

echo $x;
$x='DVB-S2。DVB-S.DVB-S2DVB-S DVB-S2 DVB-S2热鸟6/热鸟8/热鸟9,13.0';
$word='hotbird8';
$x=preg_replace(“'(?])(“$word”)(?=[^\d\w\-])(?!([^)”是“,”,$x);
$word='DVB-S2';
$x=preg_replace(“'(?])(“$word”)(?=[^\d\w\-])(?!([^)”是“,”,$x);
echo$x;
但它将
替换为


如何修复它?

您需要将其分解为三条规则:

  • 单词的两侧由非单词字符或BO[SL]/EO[SL]分隔
  • Word不在a<与其匹配>之间
  • 单词不在和之间
  • 我们需要对规则(1)进行积极的前瞻和落后:

    当单词前面有一个<代码> /code和任何非代码> 字符时,即当它位于任何HTML标记的中间时,这就阻止了匹配。

    现在,为规则(3)添加一个负前瞻:


    (?]*)(?这是我得到的,我希望它能起作用

       echo preg_replace("@((?!<a\s*[^<>]*>.*?))($word)((?!</a>.))@i",'$1<a href="">$2</a>$3',$html) . chr(10);
    
    echo preg_替换(@((?!$3',$html).chr(10);
    
    哪个会输出

    <div><a href="">DVB-S2</a>. DVB-S. <a href="">DVB-S2</a>DVB-S <sss <a href="">DVB-S2</a> /> <a href="">DVB-S2</a> <a href="dd">DVB-S2</a> <a href="">DVB-S2</a> Hot bird 6/Hot Bird 8/Hot bird 9, 13.0</div>
    
    .DVB-S.DVB-S热鸟6/热鸟8/热鸟9,13.0
    
    i测试了您的代码,我注意到第一个preg_replace没有做任何事情。更重要的是第二个regex,以及锚点替换问题。是否要替换原始a标记(如果它确实存在)?因此表达式必须查找并替换DVB-S2的所有实例,但已在标记内部的实例除外?是。除了内部标记或ta之外g attribute.Thx,但它不起作用:编译失败:lookbehind断言在偏移量10处不是固定长度。无论如何,谢谢您-您的答案对于理解该技术非常有用。非常感谢-它起作用。我编辑它是为了修复:
    到:
    @(?!*?)($word)((?=[^\s])(?!)@I
    (?<!<[^>]*)(?<=^|\W)(DVB-S2)(?=\W|$)(?!</a>)
    
       echo preg_replace("@((?!<a\s*[^<>]*>.*?))($word)((?!</a>.))@i",'$1<a href="">$2</a>$3',$html) . chr(10);
    
    <div><a href="">DVB-S2</a>. DVB-S. <a href="">DVB-S2</a>DVB-S <sss <a href="">DVB-S2</a> /> <a href="">DVB-S2</a> <a href="dd">DVB-S2</a> <a href="">DVB-S2</a> Hot bird 6/Hot Bird 8/Hot bird 9, 13.0</div>