Заменить все вхождения двойной тире (-) на -, но не внутри атрибутов или комментариев

some text here
<span class="my--class-name--here" id="some--id">some -- text--here</span>
test text--here
<div class="another--class-name">test --test</div>
<!--[if IE 9]><video style="display: none;"><![endif]-->

Для вышеупомянутого содержания, я хочу некоторую помощь в написании кода, чтобы заменить все вхождения двойной тире (--) с &mdash;,

Но он не должен заменять двойную черту для любых атрибутов внутри HTML-элементов. Например, двойная черта в имени класса (my--class-name--here) и имя пользователя (id="some--id") не следует заменять.
И, также это не должно заменить двойную черту в <!--[if IE 9]> а также <![endif]-->

0

Решение

Если вы хотите заменить одну строку за пределами < а также >Вы можете использовать следующее.

$html = preg_replace('~<[^>]*>(*SKIP)(*F)|--~', '—', $html);

Идея состоит в том, чтобы пропустить любой контент, который находится между открывающей и закрывающей скобками.

С левой стороны от оператора чередования мы сопоставляем подшаблон, который нам не нужен. Выключение и принуждение механизма регулярных выражений не повторять подстроку с помощью обратных глаголов управления.

Рабочая Демо

3

Другие решения

Используйте отрицательный взгляд, чтобы соответствовать -- который не был внутри каких-либо тегов HTML.

--(?![^><]*>)

Заменить совпавшим -- с ,

DEMO

<?php
$string = <<<EOT
some text here
<span class="my--class-name--here" id="some--id">some -- text--here</span>
test text--here
<div class="another--class-name">test --test</div>
<!--[if IE 9]><video style="display: none;"><![endif]-->
EOT;
echo preg_replace('~--(?![^><]*>)~', '—', $string);
?>

Выход:

some text here
<span class="my--class-name--here" id="some--id">some — text—here</span>
test text—here
<div class="another--class-name">test —test</div>
<!--[if IE 9]><video style="display: none;"><![endif]-->
1

По вопросам рекламы [email protected]