Php Regex删除指向另一个域的链接

Php Regex删除指向另一个域的链接,php,regex,Php,Regex,我收到一个格式化为html的文本。我想限制锚定标记的URL仅来自我的域,用“xxx”(或smth'else)替换旧链接。 输入:“” 输出:“xxx” 我正在使用regexp实现这一点,尽管我有点被困在这里: $pattern ='/<a.*href=[\'|\"]http.?:\/\/[^mydomain.*\"\']*[\'|\"].*<\/a>/i'; $replace ='xxx'; echo preg_replace($pattern, $replace, $stri

我收到一个格式化为html的文本。我想限制锚定标记的URL仅来自我的域,用“xxx”(或smth'else)替换旧链接。
输入:“

输出:“xxx”
我正在使用regexp实现这一点,尽管我有点被困在这里:

$pattern ='/<a.*href=[\'|\"]http.?:\/\/[^mydomain.*\"\']*[\'|\"].*<\/a>/i';
$replace ='xxx';
echo preg_replace($pattern, $replace, $string); 

$pattern='/当您执行
[^mydomain.*\“\']
时,您说的是“匹配除文字'm'、'y'、'd'、'o'、…、'、'*'等以外的任何字符”

尝试以下方法:

#<a [^>]*\bhref=(['"])http.?://((?!mydomain)[^'"])+\1 *>.*?</a>#i

在操作中查看它,您可以根据自己的目的对其进行调整。

当您执行
[^mydomain.*\“\']
时,您说的是“匹配除文字'm'、'y'、'd'、'o'、…、'、'、'*'等以外的任何字符。”

尝试以下方法:

#<a [^>]*\bhref=(['"])http.?://((?!mydomain)[^'"])+\1 *>.*?</a>#i
在行动中看到它,在那里你可以根据自己的目的调整它。

(尽管这不是不解释的理由。)

如果你想匹配'anything but',那么你通常想要使用断言;a在你的情况下:

 (?!mydomain\.com).*?
这将匹配
*?
任何内容,但它前面的不允许值除外

还注意到:

  • 它应该是
    [\'\']
    ,而不是
    [\'\'\'\']
    。替代符号在字符类中没有意义
  • *
    通常应为
    *?
    以避免匹配范围过宽
  • [^>]*
    是标记中要匹配的常用习惯用法
  • 您可以使用其他分隔符
    #i
    代替
    /
    ,以避免转义
    • (尽管这不是不解释某事的理由。)

      如果你想匹配'anything but',那么你通常想要使用断言;a在你的情况下:

       (?!mydomain\.com).*?
      
      这将匹配
      *?
      任何内容,但它前面的不允许值除外

      还注意到:

      • 它应该是
        [\'\']
        ,而不是
        [\'\'\'\']
        。替代符号在字符类中没有意义
      • *
        通常应为
        *?
        以避免匹配范围过宽
      • [^>]*
        是标记中要匹配的常用习惯用法
      • 您可以使用其他分隔符
        #i
        代替
        /
        ,以避免转义

      []
      是集合运算符中的字符。你的模式会更容易理解

      $pattern ='!<a\s.*?\shref\s*=\s*([\'"])https?:://mydomain.*?\1.*?</a>!is';
      

      $pattern=' 
      []
      是集合运算符中的字符。你的模式会更容易理解

      $pattern ='!<a\s.*?\shref\s*=\s*([\'"])https?:://mydomain.*?\1.*?</a>!is';
      

      $pattern=' 这是我正在使用的代码的一部分。它使用一个用户函数来更改正则表达式挖掘出的文本。祝你好运:)


      这是我正在使用的代码的一部分。它使用一个用户函数来更改正则表达式挖掘出的文本。祝你好运:)


      如果要清除的是用户输入,那么还必须处理缺少的属性引号或HTML实体伪装。因此,正则表达式只适用于普通情况;它不适合作为可靠的过滤器。(没有过度的努力。)@Gordon的可能重复:我认为解析它并不容易,因为我将标记作为已经通过过滤器的字符串的一部分来接收。如果要清理用户输入,那么还必须处理缺少的属性引号或HTML实体伪装。因此,正则表达式只适用于普通情况;它不适合作为可靠的过滤器。(没有过度的努力。)@Gordon的可能重复:我认为解析它并不容易,因为我将标记作为已经通过过滤器的字符串的一部分来接收。谢谢。它工作得很好。你能解释一下你是如何在mydomain前后实现字符匹配的吗?如“sub.mydomain.com/page1”?如果您尝试将我发布的交互式示例链接中的一个URL更改为“sub.mydomain.com/page1”,您将看到该URL也不匹配。或者您想匹配'sub.mydomain.com/page1'而不是'mydomain.com'?您不需要在PHP中转义反斜杠,除非那些转义反斜杠。在单引号中,仅解释
      \\
      \'
      。因此,如果正则表达式看起来像
      '/^\s*$/'
      ,PHP会将
      /^\s*$/
      发送到regexp引擎,因为
      \
      不会转义
      \
      '
      。使用regexp时唯一有问题的字符是
      \
      本身,因此必须使用
      \\\\
      。PHP将
      \\\\
      转换为
      \\
      ,而regexp引擎本身将其转换为
      \
      。至于
      \'
      '
      在regexp中是普通的文字字符,因此PHP可以安全地将其发送到regexp引擎,而不使用反斜杠。啊,谢谢@GlitchMr——我总是弄糊涂(习惯于python的
      r“whateveryoulike”
      格式),而不是“http.?:/”它会不会更好“[a-z]+:/”?这里有更多的模式,如“http://”或“https://”。例如“ftp://”,这也是一个外部请求,可能更多。谢谢。它工作得很好。你能解释一下你是如何在mydomain前后实现字符匹配的吗?如“sub.mydomain.com/page1”?如果您尝试将我发布的交互式示例链接中的一个URL更改为“sub.mydomain.com/page1”,您将看到该URL也不匹配。或者您想匹配'sub.mydomain.com/page1'而不是'mydomain.com'?您不需要在PHP中转义反斜杠,除非那些转义反斜杠。在单引号中,仅解释
      \\
      \'
      。因此,如果正则表达式看起来像
      '/^\s*$/'
      ,PHP会将
      /^\s*$/
      发送到regexp引擎,因为
      \
      不会转义
      \
      '
      。使用regexp时唯一有问题的字符是
      \
      本身,因此必须使用
      \\\\
      。PHP将
      \\\\
      转换为
      \\
      ,而regexp引擎本身将其转换为
      \
      。至于
      \'
      '
      是regexp中的普通文字字符,因此PHP可以安全地将其发送到regexp引擎,而无需使用反斜杠。啊,谢谢@GlitchMr——我总是对这些感到困惑(我习惯于python的