Регулярное выражение для тегов ссылок в HTML
Мне нужна помощь с регулярными выражениями. То, что я ищу, это регулярное выражение, которое выглядит для тегов ссылок, как это:
<link rel="stylesheet" href="style.css" type="text/css">
Независимо от того, где находится href="", я хотел бы найти его в теге ссылки и поместить переменную с именем $url перед style.css с помощью символа / follow. Если он находит http:// или https:// перед style.css, то я не хочу помещать переменную перед ним.
Я хочу, чтобы каждый тег ссылки был заменен.
5 ответов
Вы можете использовать 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">
Попробуйте это регулярное выражение:
/(<link.*href=["'])(style.css)(["'].[^>]*>)/gi
Заменить часть будет выглядеть
\1http://\2\3
или же
$1http://$2$3
Примечание: вам может понадобиться экранировать одну из кавычек в зависимости от того, как вы цитируете строку.
Решение этой проблемы никогда не будет красивым (или надежным) с использованием регулярных выражений, я бы рекомендовал вместо этого использовать синтаксический анализатор 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>
Я адаптировал ответ @Juicy Scripter.
Это улучшение для следующего.
а) это также работает для одинарных кавычек, а также для двойных кавычек. имея в виду
/**
*
* 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;
}
Я предполагаю, что вы редактируете один файл - ваш текстовый редактор или IDE должны иметь возможность выполнять поиск / замену регулярных выражений.
Попробуй это:
Поиск: href="([^http].*?)"
Заменить: href="<?php echo $url; ?>/\1"
Если вам нужно использовать это в PHP, используйте preg_replace. Просто помните, что ваша строка поиска требует прямой косой черты до и после нее.