2016-09-05 2 views
3

Я борюсь с регулярным выражением в php для извлечения аргументов функции из строки. Я разбираю javascript-файл в php и хочу извлечь 2 аргумента функции из строки. Вот пример того, как линии могут выглядеть:Извлечь текст из строки в php с регулярным выражением

"Backbone.Radio('comments ').trigger("added:comment " ,function(){});" 

От этой линии я хочу, чтобы извлечь слово комментарии и добавил: комментарий без пробелов или кавычек.

Я попытался с:

$arrMatches = array(); 
$strRegEx = "/\\(\\s*['\"]\\s*([^)]+?)\\s*['\"]\\s*/"; 
$nMatches = preg_match_all($strRegEx, $strLine, $arrMatches); 

Но это даст мне что-то вроде: («комментарии» и («добавил: комментарий»

Я был бы признателен за помощь с тем, как для решения этой проблемы.

+0

Невозможно «очистить» их после извлечения. Так что просто удалите '(' и '' 'и' '' после того, как вы получили свои результаты? Или этот метод повлияет на него, так как сами комментарии могут содержать скобки? –

+0

Я мог бы очистить их после извлечения, но я бы предпочел регулярное выражение только извлекает части, которые мне нужны, поэтому мне не нужен этот дополнительный шаг. – sudden01

ответ

2

Вы могли бы использовать:

<?php 

$regex = '~\(\h*([\'"])(.+?)\h*(?!\\\\)(?=\1)~'; 
$string = "Backbone.Radio('comments ').trigger(\"added:comment \" ,function(){});"; 

preg_match_all($regex, $string, $matches); 
print_r($matches[2]); 
/* 
Array 
(
    [0] => comments 
    [1] => added:comment 
) 
*/ 
?> 

Регулярное выражение ищет одиночные/двойные кавычки, захватывает их и ищет следующий сингл/двойные кавычки, которые не избежали. См. a demo on regex101.com.


Предупреждение: Хотя это может работать в этом конкретном примере, это, как правило, последний способ использования регулярного выражения - считаете ли вы, что вместо него используется синтаксический анализатор?

+0

Спасибо, это отлично работает. Но в чем польза от использования, если я использую синтаксический анализатор и какой парсер я могу использовать для этого примера? – sudden01

+0

@udden01: Ну, это полностью зависит от ваших строк ввода. Если вы сталкиваетесь с вложенными скобками, например, 'Backbone.Radio ('comment_function (" testparam ")')', который является полностью JS действительным. – Jan

+1

Хорошо, тогда я думаю, что regex будет делать плавник е. Линии, которые я проверяю, всегда будут иметь этот формат. Еще раз спасибо за вашу помощь. Я помечаю ваш ответ как принятый. – sudden01

1

На основании вашего примера будет работать примерно следующее:

$re = "/(?<=\\()(?:[ '\"]*)([\\w\\d\\:]+)(?=[ ]*['\"]*)/"; 
$str = "\"Backbone.Radio('comments ').trigger(\"added:comment \" ,function(){});\""; 

preg_match_all($re, $str, $matches); 

Вы можете добавить другие товары в соответствующую группу.

+0

Спасибо за ответ, это тоже работает. Поскольку я не эксперт по регулярному выражению, я не знаю, какое решение лучше, но они оба работают для моего дела. – sudden01

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