Справка по регулярным выражениям PHP - PullRequest
0 голосов
/ 30 марта 2011

Я использую preg_replace, чтобы удалить теги <p> и теги <li> и сделать их возврат каретки. У меня есть несколько <a> тегов в моей строке, и я хочу их убрать, но сохраняю атрибут href. Например, если у меня есть: <a href = "http://www.example.com">Click Here</a>, то, что я хочу: http://www.example.com Нажмите здесь

Вот что у меня есть

$text .= preg_replace(array("/<p[^>]*>/iU","/<\/p[^>]*>/iU","/<ul[^>]*>/iU","/<\/ul[^>]*>/iU","/<li[^>]*>/iU","/<\/li[^>]*>/iU"), array("","\r\n\r\n","","\r\n\r\n","","\r\n"), $content);

Спасибо

Ответы [ 2 ]

3 голосов
/ 30 марта 2011

На вашем месте я бы использовал SimpleHTMLDom . Вот пример использования из документов:

// 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>
0 голосов
/ 30 марта 2011

Если требуется решение регулярных выражений, вот протестированная функция, которая обрабатывает теги привязки по вашему запросу (с заметными оговорками, отмеченными ниже.) Регулярное выражение представлено в подробном режиме с комментариями:

function process_markup($content) {
    return preg_replace(
        array( // Regex patterns
            '%<(?:p|ul|li)[^>]*>%i',        // Open tags.
            '%<\/(?:p|ul|li)[^>]*>\s*%i',   // Close tags.
            '% # Match A element (with no "<>" in attributes!)
            <a\b         # Start tag name.
            [^>]+?       # anything up to HREF attribute.
            href\s*=\s*  # HREF attribute name and "="
            (["\']?)     # $1: Optional quote delimiter
            ([^>\s]+)    # $2: HREF attribute value.
            (?(1)\1)     # If open quote, match close quote.
            [^>]*>       # Remainder of start tag
            (.*?)        # $3: A element contents.
            </a\s*>      # A element end tag.
            %ix'
        ),
        array( // Replacement strings
            "",          # Simply strip P, UL, and LI open tags.
            "\r\n",      # Replace close tags with line endings.
            "$2 $3"      # Keep A element HREF value and contents.
        ), $content);
}

Я позволил себе изменить и другие регулярные выражения. Отрегулируйте при необходимости.

ПРЕДОСТЕРЕЖЕНИЯ: Это решение регулярного выражения предполагает: Все элементы A, P, UL и LI не имеют угловых скобок <> в своих атрибутах. В начальных и конечных тегах элемента A, P, UL или LI нет ни одного элемента CDATA, такого как элементы SCRIPT или STYLE, ни комментариев HTML, ни внутри других атрибутов начального тега. , В противном случае это должно работать очень хорошо для большой разметки HTML.

Я понимаю, что многие вздрагивают, когда слышат слова: HTML и REGEX, сказанные на одном дыхании, но в этом конкретном случае я думаю, что решение для регулярных выражений будет работать достаточно хорошо (в рамках вышеуказанных ограничений). Тег A является одним из тех, который не является вложенным , поэтому регулярное выражение может легко сопоставить начальный тег, содержимое и конечный тег - все в одном ударе. То же самое с отдельными начальными и конечными тегами для других элементов (которые могут быть вложенными) при рассмотрении независимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...