Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式解析包含特定单词的链接_Php_Regex_Parsing - Fatal编程技术网

Php 正则表达式解析包含特定单词的链接

Php 正则表达式解析包含特定单词的链接,php,regex,parsing,Php,Regex,Parsing,更进一步,有人能告诉我这两个正则表达式之间的区别吗?它们似乎都完成了相同的任务:从html中提取链接 表达1: '/(https?://)?(www.)?([a-zA-Z0-9_%]*)\b.[a-z]{2,4}(.[a-z]{2})?((/[a-zA-Z0-9_%])+)?(.[a-z])?/' 表达2: '/<a.*?href\s*=\s*["\']([^"\']+)[^>]*>.*?<\/a>/si' 哪一个更好用?我如何修改其中一个表达式,使之只匹配包含

更进一步,有人能告诉我这两个正则表达式之间的区别吗?它们似乎都完成了相同的任务:从html中提取链接

表达1:

'/(https?://)?(www.)?([a-zA-Z0-9_%]*)\b.[a-z]{2,4}(.[a-z]{2})?((/[a-zA-Z0-9_%])+)?(.[a-z])?/'
表达2:

'/<a.*?href\s*=\s*["\']([^"\']+)[^>]*>.*?<\/a>/si'
哪一个更好用?我如何修改其中一个表达式,使之只匹配包含某些单词的链接,而忽略不包含这些单词的任何匹配


谢谢。

在大多数情况下,我强烈建议使用HTML解析器来获取这些链接。使用正则表达式解析HTML是有问题的,因为HTML不是正则的,并且您将没有考虑边缘情况的情况。
有关更多信息,请参阅。

在大多数情况下,我强烈建议使用HTML解析器,如获取这些链接。使用正则表达式解析HTML是有问题的,因为HTML不是正则的,并且您将没有考虑边缘情况的情况。
请参阅以获取更多信息。

简单一看,第一个是垃圾,但似乎试图将链接匹配为文本,第二个是匹配html元素。

简单一看,第一个是垃圾,但似乎试图将链接匹配为文本,第二个是匹配html元素。

区别在于表达式1根据规范查找有效的完整URI。因此,您可以获得代码中某个地方的所有完整URL。这实际上与获取所有链接无关,因为它与经常使用的相对url不匹配,而且它获取每个url,而不仅仅是链接目标的url

第二个查找标记并获取href属性的内容。因此,这一个将得到你的每一个环节。除了该表达式中的一个错误*,使用它是非常安全的,并且它可以很好地获得每个链接–它检查可能出现的足够多的差异,例如空格或其他属性

*但是,该表达式中有一个错误,因为它没有查找href属性的结束引号,您应该添加它,否则可能会匹配奇怪的内容:

/<a.*?href\s*=\s*["\']([^"\'>]+)["\'][^>]*>.*?<\/a>/si
要在链接文本中查找单词,请使用:

/<a.*?href\s*=\s*["\']([^"\'>]+)["\'][^>]*>.*?word.*?<\/a>/si

区别在于表达式1根据规范查找有效的完整URI。因此,您可以获得代码中某个地方的所有完整URL。这实际上与获取所有链接无关,因为它与经常使用的相对url不匹配,而且它获取每个url,而不仅仅是链接目标的url

第二个查找标记并获取href属性的内容。因此,这一个将得到你的每一个环节。除了该表达式中的一个错误*,使用它是非常安全的,并且它可以很好地获得每个链接–它检查可能出现的足够多的差异,例如空格或其他属性

*但是,该表达式中有一个错误,因为它没有查找href属性的结束引号,您应该添加它,否则可能会匹配奇怪的内容:

/<a.*?href\s*=\s*["\']([^"\'>]+)["\'][^>]*>.*?<\/a>/si
要在链接文本中查找单词,请使用:

/<a.*?href\s*=\s*["\']([^"\'>]+)["\'][^>]*>.*?word.*?<\/a>/si
从第一个开始匹配
从第一个开始匹配我不同意,匹配一个格式良好的链接并不太困难,通过正则表达式进行匹配的开发时间只是解析器的一小部分。他甚至没有试图解析HTML,他在解析可能有链接的文本。我接受你的观点。实用主义,为了反映这一点,我修改了我的答案,他在上面说regexp是从HTML中提取一个链接。它是从Wordpress帖子的内容中提取的,所以它应该是HTML,对吗?但在这方面非常干净。使用正则表达式对我来说似乎很好,我只是想确定我使用的表达式会给我带来最好的结果。不过解析器很有趣,谢谢链接。在像您这样的封闭/已知情况下,regexp并不是不合理的。但是值得进一步研究解析器,我不知道为什么人们对使用真正的解析器如此缄默。这是正确处理HTML的唯一方法,并不十分困难。写一个解析器,当然,很难;用一个,琐碎的。提出一个正则表达式来处理链接语法的常见变体是非常困难的,在一般情况下是不可能的。你希望你正在抓取的页面上的链接格式始终保持不变吗?你不会被注释掉的链接或脚本块内容中的HTML所愚弄吗?链接元素被分割成多行?我不同意,匹配一个格式良好的链接并不太困难,而且通过正则表达式进行匹配的开发时间只是解析器的一小部分。他甚至没有试图解析HTML,他在解析可能有链接的文本。我接受你的观点。实用主义,为了反映这一点,我修改了我的答案,他在上面说regexp是从HTML中提取链接的。它是从Wordpress帖子的内容中提取的,所以应该是HTML,对吗?,
但是在这方面非常干净。使用正则表达式对我来说似乎很好,我只是想确定我使用的表达式会给我带来最好的结果。不过解析器很有趣,谢谢链接。在像您这样的封闭/已知情况下,regexp并不是不合理的。但是值得进一步研究解析器,我不知道为什么人们对使用真正的解析器如此缄默。这是正确处理HTML的唯一方法,并不十分困难。写一个解析器,当然,很难;用一个,琐碎的。提出一个正则表达式来处理链接语法的常见变体是非常困难的,在一般情况下是不可能的。你希望你正在抓取的页面上的链接格式始终保持不变吗?你不会被注释掉的链接或脚本块内容中的HTML所愚弄吗?链接元素分成多行?太棒了,谢谢你的解释。现在假设我想修改第二个表达式,以匹配链接中任何包含单词blue、red或green的链接,并忽略不包含这些单词的链接。有可能吗?就是这样。。最后一个问题,多个单词的语法是什么?功能如下:/]*[\'][^>]*>.*?/si搜索正则表达式是一场噩梦。再次感谢你。如果你想搭配红色或蓝色,就这样做:红色|蓝色;如果您不想匹配该部件本身,您也可以使用?:red | blue.hmm您是对的。我会把我的错误评论归咎于睡眠不足。删除评论。太棒了,谢谢你的解释。现在假设我想修改第二个表达式,以匹配链接中任何包含单词blue、red或green的链接,并忽略不包含这些单词的链接。有可能吗?就是这样。。最后一个问题,多个单词的语法是什么?功能如下:/]*[\'][^>]*>.*?/si搜索正则表达式是一场噩梦。再次感谢你。如果你想搭配红色或蓝色,就这样做:红色|蓝色;如果您不想匹配该部件本身,您也可以使用?:red | blue.hmm您是对的。我会把我的错误评论归咎于睡眠不足。删除注释。+1。我注意到标记语法突出显示本身被上述内容弄糊涂了,我敢打赌某个地方涉及到regexp!是的!SO的语法突出显示是一个非常复杂的正则表达式。即使它想在JS中包含一个完整的HTML解析器,它也不能真正正确地解析HTML或XML,因为它甚至不知道上面的代码块是HTML!因此,我们对它进行了一个很好的猜测,令人印象深刻的是,它做得很好,但它永远不会真正正确。但这没关系,因为这只是一些颜色,不是任何重要的东西。我注意到标记语法突出显示本身被上述内容弄糊涂了,我敢打赌某个地方涉及到regexp!是的!SO的语法突出显示是一个非常复杂的正则表达式。即使它想在JS中包含一个完整的HTML解析器,它也不能真正正确地解析HTML或XML,因为它甚至不知道上面的代码块是HTML!因此,我们对它进行了一个很好的猜测,令人印象深刻的是,它做得很好,但它永远不会真正正确。但这没关系,因为这只是一些颜色,不是任何重要的东西。
<a name="foo">anchor</a>
<a href="...">...</a>
<a href="a"></a >
<a href="b"></a>
<a href="a'b>c">
<a data-href="a" title="b>c" href="realhref">
<!-- <a href="notreallyalink"> -->