我有一个包含html链接标记的字符串,我需要使用php preg_match_all来获取标记的href值,但前提是标记没有rel ='nofollow'属性。我找到了以下表达式来获取所有链接的href值。
$regex= "/<a\s[^>]*href=([\"\']??)([^\" >]*?)\\1[^>]*>(.*)<\/a>/siU";
如何将其修改为仅获取我想要的链接?这是它应该是什么样子:
$string= "<a href='link1.php'>Link</a>";
$string.= "<a href='link2.php'>Link2</a>";
$string.= "<a href='link3.php' rel='nofollow'>Link3</a>";
$string.= "<a href='link4.php'>Link4</a>";
preg_match_all($regex, $string, $links);
所以链接应该是:
$links[0] => 'link1.php';
$links[1] => 'link2.php';
$links[2] => 'link4.php';
我需要表达式来获取同时使用单引号和双引号的链接。奖金将是获取格式不良但仍然有效的链接。如果不可能只获得我想要的链接,那么只需找到我不想要的链接并将其从数组中删除。注意字符串是动态生成的,可能没有相同的属性顺序,除了链接之外还包含其他标记和字符。
答案 0 :(得分:4)
@revo是正确的,这是not a job for regular expressions。使用适当的HTML解析器来解构HTML,然后使用XPath查询来查找所需的信息。
list1 = [1, 2, 3]
list2 = [1, 3, 3, 3, 2]
list3 = [3, 2]
print(set(list1) == set(list2)) # => True
print(set(list1) == set(list3)) # => False