заменить URL-адреса в строке preg_replace regex php

#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() .