регулярное выражение для PHP preg_replace_callback - PullRequest
2 голосов
/ 11 марта 2010

Регулярные выражения - это не мое. (

У меня есть строка, которая может содержать несколько подстрок, например:

[var1="111" var2="222" var3="222" var4="444"]

Мне нужно заменить каждое вхождение результатами функции, которая получает каждую переменную.

$string = '[var1="111" var2="222" var3="333" var4="444"]';    
$regex = 'var1="(.*)" var2="(.*)" var3="(.*)" var4="(.*)"';

function doit($matches){
    return "<strong>".implode(", ", $matches) ."</strong>";
}

echo preg_replace_callback($regex,'doit',$string);

Я ожидаю 111, 222, 333, 444 .

Но я не чувствую любви. Любая помощь будет оценена!

Редактировать: некоторые уточнения ..

Я упрощался ради вопроса.

  1. "вар" не будет называется "var1", "var2" больше похоже [recID = "22" template = "theName" option = "some value", type = "list"]

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

  3. согласованные значения могут быть почти все, не только цифры.

Ответы [ 2 ]

1 голос
/ 11 марта 2010

Я бы сделал это в два этапа:

  1. Получить теги
  2. Получить атрибуты для каждого тега

Вот пример:

function doit($match) {
    $parts = preg_split('/(\w+="[^"]*")/', $match[1], -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
    foreach ($parts as $part) {
        if (trim($part) !== "") {
            if (!preg_match('/^(\w+)="([^"]*)"$/', $part, $match)) {
                // syntax error
            } else {
                var_dump($match);
            }
        }
    }
}

$str = '[var1="111" var2="222" var3="333" var4="444"]';
$re = '/\[((?:[^"[\]]+|"[^"]*")*)]/';
preg_replace_callback($re, 'doit', $str);

При этом вы даже можете обнаружить синтаксические ошибки.

Это не идеальное решение, так как было бы более эффективно читать вводимые символы за символом и определять токены в зависимости от контекста, в котором они находятся.

1 голос
/ 11 марта 2010

Другой ответ может быть лучшим решением, но вот как вы могли бы сделать это с помощью preg_replace_callback:

$string = '[var1="111" var2="222" var3="333" var4="444"]';

// Note: regular expressions need to start and end with /
$regex = '/var1="(.*)" var2="(.*)" var3="(.*)" var4="(.*)"/';

function doit($matches){
    // The first element of matches is the complete
    // match, shift is here just to get rid of it
    // (probably a better way to do this)
    array_shift($matches);
    return "<strong>".implode(", ", $matches) ."</strong>";
}
echo preg_replace_callback($regex,'doit',$string);
...