Как выполнить преобразования тегов регулярных выражений для всех вхождений в строке в PHP? - PullRequest
0 голосов
/ 18 апреля 2019

Я хочу преобразовать мои html-строки, содержащие <p style=“text-align:center; others-style:value;”>Content</p> в <center>Content</center> и <p style=“text-align:right; others-style:value;”>Content</p> в <right>Content</right> и т. Д.

На мой предыдущий вопрос есть ответ, который можетдостичь этого прекрасно.Вот что такое регулярное выражение:

$RegEx = '/<(.*)(text-align:)(.*)(center|left|right|justify|inherit|none)(.*)(\"|\”|\'|\’)>(.*)(<\/.*)/s';
$string = preg_replace($RegEx, '<$4>$7</$4>', $string);

Однако мои строки могут содержать более одного вхождения выравнивания текста.Например, у меня может быть <div style=‘text-align:left; others-style:value;’ class=‘any class’>Any Content That You Wish</div><p style=“text-align:center; others-style:value;”>Content</p>, я хочу, чтобы он стал <left>Any Content That You Wish</left><center>Content</center>, но он просто вывел бы <center>Content</center>.

Как я могу получить то, что я хочу в PHP?Большое спасибо.

1 Ответ

1 голос
/ 18 апреля 2019

Как я писал в комментариях, вы не должны использовать регулярные выражения для манипулирования html-контентом. Но только если у вас есть не вложенные теги в html, вы можете пойти на это.

Для этого конкретного случая вы можете использовать это регулярное выражение,

<(p|div).*?\bstyle\s*=\s*.*?text-align:([a-zA-Z]+).*?>(.*?)</\1>

И заменить его на <\2>\3</\2>

Regex Demo

Демо код PHP

$html = '<p style=“text-align:center; others-style:value;”>Content</p>
<div style=‘text-align:left; others-style:value;’ class=‘any class’>Any Content That You Wish</div><p style=“text-align:center; others-style:value;”>Content</p>';

$newhtml = preg_replace("~<(p|div).*?\bstyle\s*=\s*.*?text-align:([a-zA-Z]+).*?>(.*?)</\\1>~", '<\2>\3</\2>', $html);
echo $newhtml;

печать

<center>Content</center>
<left>Any Content That You Wish</left><center>Content</center>
...