2013-06-01 3 views
0

Я всегда сталкиваюсь с регулярными выражениями, но я действительно не пытаюсь их понять и использовать. Но мой текущий проект заставляет меня использовать регулярное выражение, поэтому мне нужен кто-то, кто может дать мне правильное регулярное выражение, чтобы заменить простую строку. В основном я заменяю небольшой подмножество longtext, извлеченного из базы данных. LONGTEXT просто пункт (ы) с помощью текстовых якорей в виде:Заменить строку, используя регулярное выражение

<a href="example.com" title="blah3x">Example</a> 

Таким образом, вопрос, как я могу заменить значение атрибута заголовка? Обратите внимание, что текст может содержать еще два анкерных тега, поэтому я хотел бы специально настроить таргетинг на каждый из них.

EDIT: Я бы хотел использовать чистый PHP на этом. Я думаю, что знаю, как это сделать, используя js/jquery.

+0

@ Бармар: Я не строил проект. Я знаю, что это действительно плохо спроектировано, что в основном является причиной, по которой я хочу использовать регулярное выражение. – adredx

+1

См. Ответ Джона Конде, вы можете использовать функции специально для синтаксического анализа HTML, а не регулярного выражения. Это не имеет никакого отношения к дизайну системы. – Barmar

ответ

4
$doc = new DOMDocument(); 
$doc->loadHTML('<a href="example.com" title="blah3x">Example</a>'); 
$anchors = $doc->getElementsByTagName('a'); 
foreach ($anchors as $anchor) 
{ 
    $anchor->setAttribute('target', '__blank'); 
} 
$html = $doc->saveHTML(); 

echo $html; 

See it in action

+0

+1 для правильного разбора HTML – Patashu

+0

Хотя это, безусловно, предпочтительный метод в большинстве случаев, я не считаю правильным называть его «правильным способом». Например: если мне пришлось анализировать 10 миллиардов страниц, я бы предпочел использовать 'regex' или, более вероятно, даже' strpos'. – Alasdair

+0

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

1
$string=preg_replace(
'@<a (.*)title="(.*)"([^>]*)>(.*)</a>@iU', 
'<a $1title="'.$replacement.'"$3>$4</a>', 
$string); 

Обратите внимание, что i в конце выражения делает его чувствительно к регистру, а U делает его ungreedy.

4

Описание

Вы можете сделать это с помощью следующих регулярных выражений

(<a\b[^>]*?\btitle=(['"]))(.*?)\2

enter image description here

Резюме
  • ( начало захвата группы 1
  • <a\b потребляет открытую скобку и a следует слово перерыву
  • [^>]*? потреблять все не близкие угловую скобку символов до ... это заставляет регулярное выражение, чтобы остаться внутри тега привязки
  • \btitle= потребляет перерыв слова и title=, перерыв помогает сделать некоторые дополнительные проверки
  • (['"]) захвата группы 2, обеспечить открытый одиночной или двойной кавычки используется
  • ) близко захват группы 1
  • (.*?) начать захват группы 3, а не жадные потреблять, чтобы собрать весь текст внутри котировок
  • \2 ссылка на строку из группы захвата 2, если вы использовали одиночную кавычку для открытия значения, тогда потребуется одна кавычка для закрытия значения. То же самое, если вы использовали двойную кавычку.

В команде замены я просто заменив всю найденную строку из <a to the close quote с: группы захвата 1, а затем нужный текст NewValue с последующей тесной цитаты из группы захвата 2.

PHP пример

<?php 
$sourcestring="<a href="example.com" title="blah3x">Example</a>"; 
echo preg_replace('/(<a\b[^>]*?\btitle=([\'"]))(.*?)\2/im','\1NewValue\2',$sourcestring); 
?> 

$sourcestring after replacement: 
<a href="example.com" title="NewValue">Example</a> 

Отказ

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

Смежные вопросы