Php Regex删除指向另一个域的链接
我收到一个格式化为html的文本。我想限制锚定标记的URL仅来自我的域,用“xxx”(或smth'else)替换旧链接。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
输入:“
”输出:“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的