застрял в регулярном выражении, я не знаю, возможно ли это вообще или нет с использованием php preg_match_all

#php #regex #expression #pcre #preg-match-all

#php #регулярное выражение #выражение #pcre #preg-match-all

Вопрос:

у меня есть файл, из которого я хочу получить конкретные данные, ниже приведен пример данных

  moduleHelper.addModule('REC');
  moduleHelper.addModule('TOP');
  

Чего я хочу, так это

что угодно.что угодно (‘x’); т. е.

 moduleHelper.addModule('');
  

Это то, что я хочу вернуть.

я просто не хочу, чтобы часть ‘x’ состояла исключительно из одинарных кавычек.

я попробовал сам и написал регулярное выражение, которое приведено ниже.

/(.*).(.*)('[^.*]')/mi

это ничего не дает мне в соответствии с руководством PCRE ^ внутри [ ] делает отрицание??

Комментарии:

1. /(.*).(.*)('?[^.*]'?)/mi ?

2. Вы имеете в виду, что хотите заменить x пустой строкой?

3. Он имеет в виду, что кавычки вокруг x могут быть одинарными или двойными или что угодно.

Ответ №1:

Это можно было бы сделать с помощью preg_replace_callback, если вам захочется выяснить, как работает вся эта обратная ссылка, но я думаю, что это немного проще:

 // the regex
$regex = "/(?P<FIRST>. )?.(?P<SECOND>. )('(?P<PARAM>. )?')?/mi";

$subject = <<<EOB
moduleHelper.addModule('REC');
moduleHelper.addModule('TOP');
EOB;

$matches = array();
$numberOfMatches = preg_match_all($regex, $subject, $matches, PREG_SET_ORDER);


$results = array();
foreach($matches as $match)
{
    array_push($results, sprintf("%s.%s('')", $match['FIRST'], $match['SECOND']));
}

print_r($results);

// result:

Array
(
    [0] => moduleHelper.addModule('')
    [1] => moduleHelper.addModule('')
)
  

Ответ №2:

Попробуйте использовать следующее

 /^([^.] ).([^(] )/
  

Ответ №3:

Если ^ является первым символом в [ ], то это отрицает остальные символы в наборе. Где [ab] принимает либо a, либо b, [^ab] принимает любой символ, который не является ни a, ни b.

Также я не уверен, чего вы хотите. Вы заявляете, что вам не нужен ‘x’, но что именно вы хотите?

Комментарии:

1. я хочу, чтобы строка с именем параметра была внутри этой функции

2. Если вы используете preg_match then /(. .. (').*('))/Ui , вам следует предоставить первую часть (до ' in $matches[1] включительно и закрывающую ') in $matches[2] . Это, конечно, означает, что вам нужно указать третий параметр preg_match . Я не думаю, что возможно получить то, что вы хотите, в одной строке, вы должны использовать конкатенацию строк.

Ответ №4:

Это делает отрицание. [^.*] в данном случае означает «получить символ, который является не . или * . Я думаю, вы хотите ниже, но я не могу точно сказать.

 preg_match_all( "/(w .w )(?=(["']w ["']);)/i", $string, $matches);
  

Комментарии:

1. спасибо, Кевин, я хочу все, кроме параметра, идущего внутри функции. ваш шаблон работает нормально, но я не хочу, чтобы возвращалась часть параметра, я хочу moduleHelper.addModule(«);

2. @G molvi, я обновил свое регулярное выражение. Это позволит вам получить moduleHelper.addModule доступ ко всему, что имеет объект вызов метода и один параметр.

3. Спасибо, Кевин, ты очень близок, это дает мне moduleHelper.addModule вот и все, я хочу, чтобы это дало мне moduleHelper.addModule(«);

4. @G molvi, это самое близкое, что вы получите, не получая также параметр. Просто добавьте ('') к полученным результатам. Если вы специально пытаетесь сопоставить, moduleHelper.addModule(''); добавьте (''( в конец регулярного выражения.

Ответ №5:

Попробуйте это:

  /([^.]*).([^.]*)(.*)/
  

Комментарии:

1. извините, это все то же самое, что и раньше