Как preg_replace повторяющийся символ?

У меня есть HTML-контент. После того, как я использую код вроде

preg_match('/adm-list-table-cell.*\"del\".*\</td/', $content, $zzz);
$new_string = preg_replace('/(\s/\s)/','',$zzz[0]);
$content = str_replace($zzz[0], $new_string, $content);

найдите строку / / / / ALL / / / / / / / / / / и удалите из нее все /. как я могу сделать это с помощью только одной функции preg_replace? ссылка на регулярное выражение

попробуйте этот preg_replace('/\s+/', ' ',$zzz[0]);

Bhargav Chudasama 17.04.2018 10:00

Вы действительно ожидаете найти adm-list-table-cell в строке / / / / <span class = "del">ALL</span> / / / / / / / / / /?

Wiktor Stribiżew 17.04.2018 10:01

А почему не trim($string, ' /')?

Syscall 17.04.2018 10:02

У меня есть строка, которая после превращается в HTML. В этой строке я не хочу заменять все «/» на пустой символ, только «/», который содержит около span class = "del", поэтому я пытаюсь найти этот диапазон, потому что у меня много блоков adm-list-table-cell, но только некоторые из них могут быть с этим охватывать

Oleksandr 17.04.2018 10:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
151
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

этот шаблон preg удалит все / в строке:

$content = preg_replace('/(adm-list-table-cell[^>]*>)\\s(?:\/\s+)+(<span class = "del".*<\/span>)\\s(?:\/\\s+)+(<)/', '${1}${2}${3}', $content);

https://regex101.com/r/yCDvKE/2

Ответ принят как подходящий

Общая рекомендация StackOverflow для синтаксического анализа html - использовать синтаксический анализатор html, такой как DomDocument. Если вы предоставите дополнительную информацию о вариативности вводимого текста, я, возможно, смогу написать усовершенствованное решение DomDocument.

А пока есть прямой вызов preg_replace() с одним шаблоном без ненужного экранирования, с минимальными группами захвата и жадными классами символов для повышения эффективности и краткости.

Код: (Демо PHP) (Демонстрация паттернов)

$html = <<<HTML
<td class = "adm-list-table-cell align-right"><a href = "iblock_element_edit.php?IBLOCK_ID=1&amp;type=news&amp;ID=2&amp;lang=ru&amp;find_section_section=-1&amp;WF=Y" title = "title">2</a></td><td class = "adm-list-table-cell align-left adm-list-table-cell-last"> /  /  /  / <span class = "del">ALL</span> /  /  /  /  /  /  /  /  /  / </td>
HTML;

echo preg_replace('~adm-list-table-cell.*?\K[/ ]*(<span class = "del".*?</span>)[/ ]*~', '$1', $html);

Выход:

<td class = "adm-list-table-cell align-right"><a href = "iblock_element_edit.php?IBLOCK_ID=1&amp;type=news&amp;ID=2&amp;lang=ru&amp;find_section_section=-1&amp;WF=Y" title = "title">2</a></td><td class = "adm-list-table-cell align-left adm-list-table-cell-last"><span class = "del">ALL</span></td>

\K используется для «перезапуска» совпадения полной строки, чтобы предыдущий элемент не был уничтожен во время замены.

Использование ленивых квантификаторов в точках с любым символом (.*?) важно, чтобы избежать "пролетной передачи" целевой подстроки в вашем содержимом настоящий.

Прямая косая черта и пробелы записываются как класс символов с нулевым или большим квантификатором в случае, если целевая подстрока не требует обрезки.

p.s. ... Если у меня будет время написать решение DomDocument, я отредактирую свой ответ. (но пока я должен вернуться к своей работе)

Другие вопросы по теме