2014-02-07 3 views
1

Я пытаюсь проанализировать некоторые переменные javascript, используя PHP.javascript variable parsing by php regex

Случайные сайт: (не мой сайт)

//.... content ... 
    function(response) { 
     if (response) { 
      var data = { id: "fka1q021", action: "post", date: "today" }; 
     } 
     //..... 

$url = 'www.website.com'; 
$content = htmlspecialchars(file_get_contents($url)); 
    preg_match_all('/var data = { id: "(.*?)", action: "post", date: "today" };/', $content, $matches); 
    print_r($matches); 

Выход:

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

Я хочу получить стоимость o е идентификатор который fka1q021

Как я могу получить его? Спасибо

+0

'json_decode' человек. – moonwave99

+1

@ moonwave99 Plain 'json_decode' понимает только JSON, а не литералы объектов JavaScript. – mario

+0

@ moonwave99 - я не могу использовать json, у меня нет доступа к сайту –

ответ

2

Возможно, вы захотите попробовать preg_match вместо preg_match_all. Затем массив $matches будет содержать все согласованное выражение как его 0-й элемент, а совпадение в вашем подвыражении в скобках - в качестве его первого элемента. Этот 1-й элемент - это id, который вы ищете.

Итак, попробуйте:

preg_match('/var data = { id: "(.*?)", action: "post", date: "today" };/', $content, $matches); 

Вот полный пример кода:

<?php 

$content = <<<ENDOFCONTENT 
//.... content ... 
    function(response) { 
    if (response) { 
     var data = { id: "fka1q021", action: "post", date: "today" }; 
    } 
//..... 
ENDOFCONTENT; 

preg_match('/var data = { id: "(.*?)", action: "post", date: "today" };/', $content, $matches); 
print_r($matches); 
print "id = " . $matches[1] . "\n"; 

Вот полученный результат:

Array 
(
    [0] => var data = { id: "fka1q021", action: "post", date: "today" }; 
    [1] => fka1q021 
) 
id = fka1q021 
+0

Array пуст ... Вывод: Array() –

+0

Я отредактировал свой ответ на включая исходный контент (образец), который вы предоставили, вместе с моим итоговым результатом. Он показывает, что он работает. Вы уверены, что '$ content = htmlspecialchars (file_get_contents ($ url));' делает то, что вы думаете, что он делает? вам будет полезно распечатать '$ content' сразу после этой строки вашего кода, чтобы убедиться, что у вас есть полное содержимое файла. –

+0

[CBroe] (http://stackoverflow.com/users/1427878/cbroe) У меня есть точка, касающаяся 'htmlspecialchars'. Его ответ получает от меня большой голос. –

0

Javascript - это клиентская сторона, а PHP - серверная, поэтому весь PHP будет выполнен до запуска Javascript. См. Этот вопрос: How to pass JavaScript variables to PHP?

+0

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

0

Я не уверен, что ваше право является законным ... JS ans PHP не выполняется одновременно и в том же месте. Может быть, вы получили это после аякс-звонка?

В любом случае, анализ данных JS с помощью php может быть выполнен с помощью json_decode. Я думаю, ваша проблема здесь будет то, что json_decode не поймет {идентификатор: "значение"}, он должен { "ID": "значение"} вместо ...

if (preg_match("#data = ({[^}]*})#",$data,$matches)) 
    json_decode($matches[1]) ; 

Например,

print_r(json_decode('{"id":"fka1q021","action":"post","date":"today"}')); 

Рендер РНР объект:

stdClass Object 
(
    [id] => fka1q021 
    [action] => post 
    [date] => today 
) 
+0

Он пытается разобрать JavaScript-объект в PHP. Он не написан как действительный JSON, поэтому 'json_decode' не будет работать, если только он не сможет« исправить »строку. –

0

очень простое регулярное выражение является

(?:id:\s(\".*?\")) 

Regular expression visualization

Debuggex Demo

, то идентификатор будет в группе захвата 1.

Позвольте мне знать, если вам нужен более сложных выражений. И если да, укажите больше информации.

1

Вы что-нибудь с вашим регулярным выражением не получаю, потому что вы применяете htmlspecialchars к содержимому, которое вы читаете, и которое заменяет " с &quot;, поэтому ваше выражение не находит " у вас там.

Просто удалите htmlspecialchars, и ваш образец будет соответствовать.