Преобразование регулярного выражения Javascript в выражение PHP (PCRE) - PullRequest
1 голос
/ 18 марта 2010

Я в восторге от регулярных выражений, и у меня есть это регулярное выражение, которое работает в javascript (и flash), которое я просто не могу получить в PHP

Вот оно:

  var number
      = '(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)';
  var oneChar = '(?:[^\\0-\\x08\\x0a-\\x1f\"\\\\]'
      + '|\\\\(?:[\"/\\\\bfnrt]|u[0-9A-Fa-f]{4}))';
  var str = '(?:\"' + oneChar + '*\")';
  var varName = '\\$(?:' + oneChar + '[^ ,]*)';
  var func = '(?:{[ ]*' + oneChar + '[^ ]*)';
  // Will match a value in a well-formed JSON file.
  // If the input is not well-formed, may match strangely, but not in an unsafe
  // way.
  // Since this only matches value tokens, it does not match whitespace, colons,
  // or commas.
  var jsonToken = new RegExp(
      '(?:false|true|null'
      +'|[\\}]'
      + '|' + varName
      + '|' + func
      + '|' + number
      + '|' + str
      + ')', 'g');

Если вы хотите, чтобы он был полностью собран, вот это:

/(?:false|true|null|[\}]|\$(?:(?:[^\0-\x08\x0a-\x1f"\\]|\\(?:["/\\bfnrt]|u[0-9A-Fa-f]{4}))[^ ,]*)|(?:{[ ]*(?:[^\0-\x08\x0a-\x1f"\\]|\\(?:["/\\bfnrt]|u[0-9A-Fa-f]{4}))[^ ]*)|(?:-?\b(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\b)|(?:"(?:[^\0-\x08\x0a-\x1f"\\]|\\(?:["/\\bfnrt]|u[0-9A-Fa-f]{4}))*"))/g

Интересно, что он очень похож на JSON.

Мне нужно это регулярное выражение для работы в PHP ...

Вот что у меня есть в PHP:

    $number = '(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)';
    $oneChar = '(?:[^\\0-\\x08\\x0a-\\x1f\"\\\\]|\\\\(?:[\"/\\\\bfnrt]|u[0-9A-Fa-f]{4}))';
    $string = '(?:\"'.$oneChar.'*\")';
    $varName = '\\$(?:'.$oneChar.'[^ ,]*)';
    $func = '(?:{[ ]*'.$oneChar.'[^ ]*)';

    $jsonToken = '(?:false|true|null'
      .'|[\\}]'
      .'|'.$varName
      .'|'.$func
      .'|'.$number
      .'|'.$string
      .')';

    echo $jsonToken;

    preg_match_all($jsonToken, $content, $out);

    return $out;

Вот что произойдет, если я попытаюсь использовать preg_match_all ():

Предупреждение: preg_match_all () [function.preg-match-all]: компиляция не удалось: ничего не повторить со смещением 0 по линии 88

Любая помощь будет принята с благодарностью!

Спасибо, Matt

Ответы [ 2 ]

2 голосов
/ 18 марта 2010

Полагаю, это происходит потому, что у вас нет регулярного выражения между разделителями .

Попытка:

$jsonToken = '@(?:false|true|null'
      .'|[\\}]'
      .'|'.$varName
      .'|'.$func
      .'|'.$number
      .'|'.$string
      .')@';
2 голосов
/ 18 марта 2010

В preg в шаблоне необходим разделитель, например вы используете его как

preg_match_all('#[a-z]+#i', ....);   // # is the delimiter, i means case-insensitive.

Попробуйте добавить их и посмотрите, есть ли еще ошибки.

...