Regex Replace с Backreference, модифицированным функциями - PullRequest
4 голосов
/ 19 февраля 2010

Я хочу заменить класс текстом div следующим образом:
Это: <div class="grid-flags" >FOO</div>

Становится: <div class="iconFoo" ></div>

Таким образом, класс изменяется на «иконку». ucfirst (strtolower (FOO)) и текст удаляется

Тест HTML

<div class="grid-flags" >FOO</div>

шаблон

'/class=\"grid-flags\" \>(FOO|BAR|BAZ)/e'

Замена

'class="icon'.ucfirst(strtolower($1).'"'

Это один пример замещающей строки, которую я пробовал, казалось бы, из сотен. Я читал, что модификатор / e оценивает код PHP, но я не понимаю, как он работает в моем случае, потому что мне нужны двойные кавычки вокруг имени класса, поэтому я не знаю, как это сделать.

Я пробовал варианты на backref, например. strtolower ('$ 1'), strtolower ('\ 1'), strtolower ('{$ 1}') *

Я пробовал одинарные и двойные кавычки, различные экранированные символы и т. Д., Но пока ничего не получалось.

Я даже попробовал preg_replace_callback () без удачи

function callback($matches){
    return 'class="icon"'.ucfirst(strtolower($matches[0])).'"';
}

Ответы [ 3 ]

3 голосов
/ 19 февраля 2010

Мне было трудно попытаться понять, что вы имели в виду, но я думаю, что вы хотите что-то вроде этого:

preg_replace('/class="grid-flags" \>(FOO|BAR|BAZ)/e',
             '\'class="icon\'.ucfirst(strtolower("$1")).\'">\'',
             $text);

Вывод для вашего примера ввода:

<div class="iconFoo"></div>

Если это не то, что вы хотите, не могли бы вы дать нам несколько примеров входов и выходов?

И я должен согласиться, что это было бы проще с парсером HTML.

2 голосов
/ 19 февраля 2010

Вместо использования опции e (valuate) вы можете использовать preg_replace_callback () .

$text = '<div class="grid-flags" >FOO</div>';
$pattern = '/class="grid-flags" >(FOO|BAR|BAZ)/';
$myCB = function($cap) {
  return 'class="icon'.ucfirst($cap[1]).'" >';
};
echo preg_replace_callback($pattern, $myCB, $text);

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

0 голосов
/ 19 февраля 2010

Это работает для меня

$html = '<div class="grid-flags" >FOO</div>';

echo preg_replace_callback(
    '/class *= *\"grid-flags\" *\>(FOO|BAR|BAZ)/'
  , create_function( '$matches', 'return \'class="icon\' . ucfirst(strtolower($matches[1])) .\'">\'.$matches[1];' )
  , $html
);

Просто помните о проблемах разбора HTML с регулярным выражением .

...