2015-04-09 5 views
0

У меня возникла проблема с созданием регулярного выражения для извлечения значения из кода JavaScript.
Мне нужно найти строку, где находится Array('38'), и получить числовое значение аргумента функции Math.floor.PHP Regex получает значение из кода JavaScript

Учитывая этот код, результат будет 296:

addCombination(158, new Array('38'), -9, Math.floor(296), 0, -1, 'LB229'); 
addCombination(159, new Array('39'), -2, Math.floor(221), 0, -1, 'LB201'); 
addCombination(160, new Array('40'), -2, Math.floor(201), 0, -1, 'LB243'); 

Спасибо за советы.

+0

Не могли бы вы объяснить немного больше, что вам нужно получить? * Result * of 'Math.floor (296)', если строка содержит 'Array ('38')'? Или подстрока 'Math.floor (296)'? –

+0

привет, мне нужно извлечь номер 296 из Math.floor (296), если строка содержит Array ('38 '). Большое спасибо в продвинутом –

ответ

0

Вот example PHP code можно использовать для извлечения Math.floor S:

<?php 
    $str = "addCombination(158, new Array('38'), -9, Math.floor(296), 0, -1, 'LB229');\naddCombination(159, new Array('38'), -2, Math.floor(221), 0, -1, 'LB201');\naddCombination(160, new Array('38'), -2, Math.floor(201), 0, -1, 'LB243');"; 
    preg_match_all("/Math\\.floor\\(\\K\\d+(?=\\))/", $str, $matches); 
    foreach ($matches[0] as $line) 
    { 
     echo $line . "\n"; 
    } 
?> 

Выход:

296                                                              
221                                                              
201 
+0

привет, этот не работает, как строка ir из нескольких строк и preg_match extrancting только значение первой строки ... –

+0

нормально, но там у нас есть массив, вопрос в том, чтобы получить значения из отдельных строк , например, если массив ('38 '), то извлеченное значение 296; if array ('39 ') then - 221; if array ('40 ') then - 201; –

+0

Я обновил код. Теперь он работает как ожидалось. –

1

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

^(?=.*\bArray\('38'\)).*?\bMath\.floor\(\K\d+ 

DEMO

  • (?=.*\bArray\('38'\)) будет соответствовать в начале строки, только если строка содержит текст Array('38').

  • И следующее .*?\bMath\.floor\( соответствует всем символам на этой линии с самого начала до Match.floor(.

  • \K сбрасывает предыдущий матч.

  • \d+ соответствует количеству, присутствующему в функции Math.floor.

Пример:

$s = <<<EOT 
addCombination(158, new Array('38'), -9, Math.floor(296), 0, -1, 'LB229'); 
addCombination(159, new Array('39'), -2, Math.floor(221), 0, -1, 'LB201'); 
addCombination(160, new Array('40'), -2, Math.floor(201), 0, -1, 'LB243'); 
EOT; 
preg_match_all("~^(?=.*\bArray\('38'\)).*?\bMath\.floor\(\K\d+~m", $s, $matches); 
print_r($matches[0]); 

Выход:

Array 
(
    [0] => 296 
) 
+0

странно ... он не будет работать как строка php ... $ regex = "/^(? =. * \ BArray \ ('38' \)). *? \ BMath \ .floor \ (\ K \ d +/"; –

+0

включить многострочный модификатор –

+0

@JB проверить мое обновление –

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