#regex #preg-replace
#регулярное выражение #preg-replace
Вопрос:
Мне нужно заменить URL-адреса в моем контенте другим префиксом url: т.е. Если текущий URL-адрес есть <a href="http://myoldurl.com">link</a>
, и я хочу изменить его на: <a href="http://myurl.com/create/?url=http://myoldurl.com">link</a>
как можно заменить мои ссылки с помощью preg_replace?
Ответ №1:
Отказ от ответственности:
При работе с (X) HTML всегда лучше использовать специальный синтаксический анализатор. Безусловно, существуют файлы, содержащие разметку, которые могут привести к сбою этого решения с регулярными выражениями. Строки Evil edge, размещенные внутри комментариев, разделов CDATA, скриптов, стилей и / или значений атрибутов, могут привести к сбою. (Хотя они должны быть очень редкими.)
Тем не менее…
Многие здесь скажут вам НИКОГДА не использовать regex с HTML. Однако этот вопрос связан с очень конкретной целевой строкой, и тщательно разработанное решение для регулярных выражений может хорошо работать для этой одноразовой задачи. Вот как я бы это сделал:
$text = preg_replace('%
# Match A element open tag up through specific HREF value.
( # $1: Everything up to target HREF value.
<A # Literal start of A element open tag.
(?: # Zero or more attributes before HREF.
s # Whitespace required before each attribute.
(?!HREF) # Assert this attribute is not HREF.
[w-.:] # Required attribute name.
(?: # Attribute value is optional.
s*=s* # Attrib value separated by =.
(?: # Group attrib value alternatives.
"[^"]*" # Either double quoted value,
| '[^']*' # or single quoted value,
| [w-.:] # or unquoted value.
) # End attrib value alternatives.
)? # Attribute value is optional.
)* # Zero or more attributes before HREF.
s # Whitespace required before HREF attribute.
HREF # HREF attribute name.
s*=s* # Value separated by =, optional whitespace.
) # End $1: Everything up to target HREF value.
(['"]) # $2: HREF attrib value opening quote.
http://myoldurl.com # Target URL to be replaced.
.*? # Any path/query/fragment on target URL.
2 # HREF attrib value matching closing quote.
%xi',
'$1"http://myurl.com/create/?url=http://myoldurl.com"',
$text);
Это заменит целевой URL-адрес только тогда, когда он находится внутри HREF
атрибута A
тегов ссылок (со значением, заключенным в одинарные или двойные кавычки). Это также удалит любой путь / запрос / фрагмент, который может быть добавлен к старым целевым URL-адресам. Это позволяет любому количеству других атрибутов тега появляться перед HREF
атрибутом.
Ответ №2:
Заменит каждую http://myoldurl.com
ссылку в каждой ссылке на $string
http://myurl.com/create/?url=http://myoldurl.com
:
$string = preg_replace("/href="http://myoldurl.com/i", "href="http://myurl.com/create/?myoldurl.com", $string);
Комментарии:
1.
str_replace()
здесь должно быть достаточно 🙂2. Название заданного вопроса
preg_replace
, но вы, конечно, правы. Поскольку это URL-адреса, я бы все же использовалstr_ireplace()
.