2013-12-12 5 views
2

С тех пор я пытаюсь найти правильное регулярное выражение. Скажем, у меня есть это:preg_match правильное регулярное выражение

$string = 'a=a.split("")'; 

и

$string = 'a=Ik(a,66)'; 

Что я хочу получить как результат:

[1] => a 
[2] => a 
[3] => split 
[4] => "" 

и второй:

[1] => a 
[2] => IK 
[3] => a,66 

Я пробовал:

preg_match('#(.+)=(.+).(.+)[(](.+)[)]#', $string, $matches); 

, но это выводит:

Array 
(
    [0] => a=a.split("") 
    [1] => a 
    [2] => a.spl 
    [3] => t 
    [4] => "" 
) 

Почему я хочу этого? Я хочу преобразовать javascript в PHP. Например:

function Hk(a) { 
    a = a.split(""); 
    a = a.slice(1); 
    a = a.reverse(); 
    a = Ik(a, 66); 
    a = a.slice(2); 
    a = a.reverse(); 
    a = Ik(a, 12); 
    return a.join("") 
} 

function Ik(a, b) { 
    var c = a[0]; 
    a[0] = a[b % a.length]; 
    a[b] = c; 
    return a 
} 

# Edit: Что я хочу, чтобы преобразовать его в PHP код и выводе его. Я не хочу его исполнять.

Например, выше яваскрипта код должен стал чем-то вроде этого:

Первая функция:

$a = str_split($a); 
$a = array_slice($a, 1); 
$a = array_reverse($a); 
$a = self::Ik($a,66); 
$a = array_slice($a, 2); 
$a = array_reverse($a); 
$a = self::Ik($a,12); 
return implode("", $a); 

вторая функция:

$c = $a[0]; 
$a[0] = $a[$b%count($a)]; 
$a[$b] = $c; 
return $a; 

function сама часть не Тон задает. Мне нужна только логика в самой функции.

+0

Так вы ж ant lex/разбор кода в списке токенов? –

+0

Что я в основном хочу, это преобразовать код javascript в php. – Michael

+0

Вы смотрите на огромное усилие, вы не можете сделать это только с одним выражением. Лексер либо построен с использованием генератора лексера и нескольких регулярных выражений, либо вы можете создавать свои собственные, но это очень сложно. Я уже пробовал создавать php-lexer, но еще не закончен, и у меня есть несколько часов кодирования. –

ответ

0

Вы можете consider preg_split:

$arr = preg_split('/[=()]/', 'a=a.split("")', -1, PREG_SPLIT_NO_EMPTY); 
Array 
(
    [0] => a 
    [1] => a.split 
    [2] => "" 
) 

$arr = preg_split('/[=()]/', 'a=Ik(a,66)', -1, PREG_SPLIT_NO_EMPTY); 
Array 
(
    [0] => a 
    [1] => Ik 
    [2] => a,66 
) 
+0

Честно говоря, это было бы хорошо. У вас есть идея, что я могу продвигаться со второй функцией javascript? Я имею в виду, как я могу преобразовать его в php? С первым легче, но со вторым он выглядит очень тяжело. Спасибо – Michael

+0

Я только что заметил ваш отредактированный вопрос. Я отправил ответ, прежде чем вы внесли изменения, просто чтобы обозначить данные строки, как вы хотели. Однако преобразовать весь сложный Javascript в PHP нельзя только одним регулярным выражением. JS и PHP - это разные языки и имеют очень различный синтаксис, который необходимо преобразовать вручную. – anubhava

+0

Если вам действительно нужно (что я бы посоветовал), ассоциативный массив работал бы. т. е. '$ a = array ('reverse' => 'array_reverse')' и сопоставлять детали с массивом. – thepratt

0

С PHP PCRE это должно работать для обоих моделей, даже если у вас есть различные элементы массива заполнены, в зависимости, который соответствует шаблон. Я думаю, вы можете понять это наше с тестированием элементов ноля и т.д. Это делаются с утверждением и опережающим просмотром (у нас есть точка, которая приводит к одному элементу более):

([^=]+)=(?(?=.+\.)([^.]+)\.([^.]+)|([^.]+))\((.+)\) 

Это то, что приходит до:

(
    [0] => Array 
     (
      [0] => a=Ik(a,66) 
     ) 

    [1] => Array 
     (
      [0] => a 
     ) 

    [2] => Array 
     (
      [0] => 
     ) 

    [3] => Array 
     (
      [0] => 
     ) 

    [4] => Array 
     (
      [0] => Ik 
     ) 

    [5] => Array 
     (
      [0] => a,66 
     ) 

) 

и этот:

(
    [0] => Array 
     (
      [0] => a=a.split("") 
     ) 

    [1] => Array 
     (
      [0] => a 
     ) 

    [2] => Array 
     (
      [0] => a 
     ) 

    [3] => Array 
     (
      [0] => split 
     ) 

    [4] => Array 
     (
      [0] => 
     ) 

    [5] => Array 
     (
      [0] => "" 
     ) 

) 

надеюсь, что это помощь;)

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