HTML中链接标记的正则表达式

时间:2009-08-13 17:07:08

标签: php regex html-parsing link-tag

我需要正则表达式的帮助。我正在寻找的是一个正则表达式,寻找像这样的链接标签:

<link rel="stylesheet" href="style.css" type="text/css">

无论href =“”的位置如何,我都希望在link-tag中查找它,并在style.css前面添加一个名为$ url的变量,并带有/ following。如果它在style.css前面找到http://或https://,那么我不想把变量放在它前面。

我希望每个链接标记都被替换。

5 个答案:

答案 0 :(得分:3)

您可以像这样使用preg_replace来存档所需的结果:

preg_replace('/(<link\b.+href=")(?!http)([^"]*)(".*>)/', '$1'.$url.'$2$3$4', $html);

所以这段代码(假设存储在$ html和$ url ='http://mydomain.com/'):

<link rel="stylesheet" href="style.css" type="text/css">
<link rel="stylesheet" href="style2.css" type="text/css">
<link rel="stylesheet" href="http://google.com/style3.css" type="text/css">
<link rel="stylesheet" href="style4.css" type="text/css">
<link rel="stylesheet" href="https://google.com/style5.css" type="text/css">
<link rel="stylesheet" href="some/path/to/style6.css" type="text/css">

将转换为:

<link rel="stylesheet" href="http://mydomain.com/style.css" type="text/css">
<link rel="stylesheet" href="http://mydomain.com/style2.css" type="text/css">
<link rel="stylesheet" href="http://google.com/style3.css" type="text/css">
<link rel="stylesheet" href="http://mydomain.com/style4.css" type="text/css">
<link rel="stylesheet" href="https://google.com/style5.css" type="text/css">
<link rel="stylesheet" href="http://mydomain.com/some/path/to/style6.css" type="text/css">

答案 1 :(得分:2)

使用正则表达式的解决方案永远不会相当(或可靠),我建议使用DOM解析器,并使用其中一种操作方法添加属性。看看simplehtmldom:

http://simplehtmldom.sourceforge.net/

例如,看看这个:

// Create DOM from string
$html = str_get_html('<div id="hello">Hello</div><div id="world">World</div>');

$html->find('div', 1)->class = 'bar';

$html->find('div[id=hello]', 0)->innertext = 'foo';

echo $html; // Output: <div id="hello">foo</div><div id="world" class="bar">World</div>

答案 2 :(得分:2)

试试这个正则表达式:

/(<link.*href=["'])(style.css)(["'].[^>]*>)/gi 

替换部分看起来像

\1http://\2\3

$1http://$2$3

注意:您可能需要根据引用字符串的方式来转义其中一个引号。

答案 3 :(得分:0)

我改编了@Juicy Scripter的答案。

这是对以下内容的改进。

a)它也适用于单引号和双引号。含义

/**
 *
 * Take in html content as string and find all the <script src="yada.js" ... >
 * and add $prepend to the src values except when there is http: or https:
 *
 * @param $html String The html content
 * @param $prepend String The prepend we expect in front of all the href in css tags
 * @return String The new $html content after find and replace. 
 * 
 */
    protected static function _prependAttrForTags($html, $prepend, $tag) {
        if ($tag == 'css') {
            $element = 'link';
            $attr = 'href';
        }
        else if ($tag == 'js') {
            $element = 'script';
            $attr = 'src';
        }
        else if ($tag == 'img') {
            $element = 'img';
            $attr = 'src';
        }
        else {
            // wrong tag so return unchanged
            return $html;
        }
        // this checks for all the "yada.*"
        $html = preg_replace('/(<'.$element.'\b.+'.$attr.'=")(?!http)([^"]*)(".*>)/', '$1'.$prepend.'$2$3$4', $html);
        // this checks for all the 'yada.*'
        $html = preg_replace('/(<'.$element.'\b.+'.$attr.'='."'".')(?!http)([^"]*)('."'".'.*>)/', '$1'.$prepend.'$2$3$4', $html);
        return $html;
    }

答案 4 :(得分:-2)

我猜你正在编辑一个文件 - 你的文本编辑器或IDE应该能够为你进行正则表达式搜索/替换。

试试这个:

搜索:href="([^http].*?)"

替换:href="<?php echo $url; ?>/\1"

如果您需要在PHP中使用它,请使用preg_replace。请记住,您的搜索字符串需要在它之前和之后使用正斜杠。