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]-->
Для вышеупомянутого содержания, я хочу некоторую помощь в написании кода, чтобы заменить все вхождения двойной тире (--
) с —
,
Но он не должен заменять двойную черту для любых атрибутов внутри HTML-элементов. Например, двойная черта в имени класса (my--class-name--here
) и имя пользователя (id="some--id"
) не следует заменять.
И, также это не должно заменить двойную черту в <!--[if IE 9]>
а также <![endif]-->
Если вы хотите заменить одну строку за пределами <
а также >
Вы можете использовать следующее.
$html = preg_replace('~<[^>]*>(*SKIP)(*F)|--~', '—', $html);
Идея состоит в том, чтобы пропустить любой контент, который находится между открывающей и закрывающей скобками.
С левой стороны от оператора чередования мы сопоставляем подшаблон, который нам не нужен. Выключение и принуждение механизма регулярных выражений не повторять подстроку с помощью обратных глаголов управления.
Используйте отрицательный взгляд, чтобы соответствовать --
который не был внутри каких-либо тегов HTML.
--(?![^><]*>)
Заменить совпавшим --
с —
,
<?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]-->