У меня есть 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?
ссылка на регулярное выражение
Вы действительно ожидаете найти adm-list-table-cell в строке / / / / <span class = "del">ALL</span> / / / / / / / / / /?
А почему не trim($string, ' /')?
У меня есть строка, которая после превращается в HTML. В этой строке я не хочу заменять все «/» на пустой символ, только «/», который содержит около span class = "del", поэтому я пытаюсь найти этот диапазон, потому что у меня много блоков adm-list-table-cell, но только некоторые из них могут быть с этим охватывать






этот шаблон preg удалит все / в строке:
$content = preg_replace('/(adm-list-table-cell[^>]*>)\\s(?:\/\s+)+(<span class = "del".*<\/span>)\\s(?:\/\\s+)+(<)/', '${1}${2}${3}', $content);
Общая рекомендация 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&type=news&ID=2&lang=ru&find_section_section=-1&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&type=news&ID=2&lang=ru&find_section_section=-1&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, я отредактирую свой ответ. (но пока я должен вернуться к своей работе)
попробуйте этот
preg_replace('/\s+/', ' ',$zzz[0]);