php domdocument loadHTML与跳过错误或正则表达式解决方案

时间:2012-09-06 11:02:37

标签: php html regex preg-replace preg-replace-callback

今天早些时候我问了一个关于使用正则表达式解决方案来替换html中所有链接的hrefs并返回某些函数的问题。

然后我删除它,因为它似乎可以使用DomDocument解决它,但事实证明,我不能......

看到我的HTML有很多错误的html syntex,html5代码等等。所以既没有loadHTML,也没有loadXML工作..

如果有人可以提供正则表达式的解决方案来查找href并使用调用函数替换所有..我已经尝试了preg_replace和preg_replace_callback,但我无法理解$ 1,$ 2..whole概念。 。 我搜索了所有类似的问题,但他们都有DomDocumenet的答案,我无法使用..

旧的类似问题: Grabbing the href attribute of an A element

Find all hrefs in page and replace with link maintaining previous link - PHP

但我需要正则表达式解决方案

2 个答案:

答案 0 :(得分:1)

试试这段代码:

// $text - your text
// $1 - preg variable for 1st "(.*)" match
// $2 - preg variable for 2nd "(.*)" match
preg_replace('/<a(.*)href="([^"]*)"(.*)>/','<a $1 href="http://new.href" $3>',$text);

我在这里粘贴工作示例: http://codepad.org/KORtcb9q

答案 1 :(得分:1)

我创建了一个...主要问题通常是人们害怕有其他属性,在href之前,href之后,空格,错误的url规范,单引号或双引号中的href url等等。最大的优点是我学到了如何使用它们..

$callback = function ($match) use($params){
        $data = MyClass::updateUrl($match[2], $params);
        $return_data = 'href='.$match[1].$data.$match[1];
        return $return_data;
    };
    $reg = "#href\s*=\s*(\"|')?([^\"'>]+)(\"|')#i";
    return preg_replace_callback($reg, $callback, $html);