Мне нужно заменить все:
<p class="someClass someOtherClass">content</p>
с
<h2 class="someClass someOtherClass">content</h2>
в строке содержимого. В основном я просто хочу заменить "p"
на "h2"
.
Это то, что у меня есть до сих пор:
/<p(.*?)class="(.*?)pageTitle(.*?)">(.*?)<\/p>/
Это соответствует всему тегу <p>
, но я не уверен, как бы я пошел на замену <p>
на <h2>
Как мне это сделать?
Следующее должно делать то, что вы хотите:
$str = '<p>test</p><p class="someClass someOtherClass">content</p>'; $newstr = preg_replace('/<p .*?class="(.*?someClass.*?)">(.*?)<\/p>/','<h2 class="$1">$2</h2>',$str); echo $newstr;
Точка ( .
) Соответствует всем. Звездочка соответствует либо 0, либо количеству совпадений. Все, что находится внутри скобки, – это группа. Переменная $2
является ссылкой на сопоставленную группу. Число внутри фигурных скобок ( {1}
) является квантором, что означает совпадение с предыдущей группой один раз. Вероятно, этот квантификатор не нужен, но он все равно и работает нормально. Обратная косая черта избегает любых специальных символов. Наконец, вопросительный знак делает бит .*
Бит не жадным, поскольку по умолчанию он есть.
Не делай этого лучше, но это поможет 🙂
$text = '<p class="someClass someOtherClass">content</p>'; $output = str_replace( array('<p', '/p>'), array('<h2', '/h2>'), $text );
Это будет работать 🙂
preg_replace('/<p .*?class="(.*?)">(.*?)<\/p>/','<h2 class="$1">$2</h2>',$value);
Извините, немного поздно на вечеринку. Я использовал регулярное выражение из ответа:
$str = '<p>test</p><p class="someClass someOtherClass">content</p>'; $newstr = preg_replace('/<p .*?class="(.*?someClass.*?)">(.*?)<\/p>/','<h2 class="$1">$2</h2>',$str); echo $newstr;
этот подход имеет проблему, когда у вас больше p-тэгов, например, в блоке текста. Вот как я затвердел регулярное выражение, чтобы охватить эту ситуацию:
$newstr = preg_replace('/<p [^<]*?class="([^<]*?someClass.*?)">(.*?)<\/p>/','<h2 class="$1">$2</h2>',$str);