Preg_match_all и сложное регулярное выражение для текстового соответствия

например, у меня есть ответ с данными отсюда: http://www.facebook.com/ajax/shares/view/?target_fbid=410558838979218&__a=1.

есть паттерн, который выглядит так:

data-hovercard=\"\/ajax\/hovercard\/hovercard.php?id=655581307\">

как я могу разобрать его с помощью preg_match_all () в PHP? Я знаю, что мне нужно сложное регулярное выражение, но я понятия не имею, как написать его для такого шаблона в тексте. Спасибо за помощь

UPD: следующий код действительно дает идентификатор:

$str = 'hovercard.php?id=655581307';
preg_match_all('/[0-9]{9}/', $str , $matches);
print_r($matches);

НО

этот не

$url = 'http://www.facebook.com/ajax/shares/view/?target_fbid=410558838979218&__a=1';
$html = file_get_contents($url);
preg_match_all('/[0-9]{9}/', $html, $matches);
print_r($matches);

person Leg0    schedule 11.07.2012    source источник
comment
Ну, единственная переменная здесь - это значение id, верно? Тогда это не так сложно, просто [0-9] {9} подойдет. Нет?   -  person Maresh    schedule 11.07.2012
comment
да, мне нужно получить идентификатор. следующий код дает мне идентификатор, если я использую такую ​​строковую переменную в моем источнике: $ str = 'hovercard.php? id = 655581307'; НО, если я использую $ html = file_get_contents ($ url); я не понимаю, см. мое обновление по вопросу   -  person Leg0    schedule 11.07.2012
comment
Хм, потому что второе не то же самое, есть 14 номеров, если вы хотите, чтобы он совпадал для обоих, возможно, id = [0-9] + &? или [0-9] {9,14} есть несколько способов написать это.   -  person Maresh    schedule 11.07.2012


Ответы (1)


Это становится немного запутанным из-за экранирования материала обратной косой чертой, но для того, чтобы точно соответствовать этой строке, этот вызов preg_match_all () должен работать:

preg_match_all('#(data-hovercard=\\\\"\\\\/ajax\\\\/hovercard\\\\/hovercard.php\?id=[0-9]+\\\\">)#', $str, $matches);

Это даст вам всю строку, которую вы разместили в $ match. Однако, если вам нужны только числа из id, вы можете добавить вокруг них дополнительные скобки, например:

preg_match_all('#(data-hovercard=\\\\"\\\\/ajax\\\\/hovercard\\\\/hovercard.php\?id=([0-9]+)\\\\">)#', $str, $matches);

И числа будут отображаться индивидуально в $ match (аналогично, вы можете удалить круглую скобку, которая обертывает все регулярное выражение, чтобы перестать соответствовать всей строке).

Обновление:

И теперь я вижу, что вопрос обновлен. Если ваш новый пример не работает, это потому, что в полученных вами данных нет последовательности из 9 цифр. Когда я пробую себя, я просто получаю ответ, в котором говорится, что мне нужно войти в систему, так что, возможно, ваши проблемы с сопоставлением на самом деле связаны с тем, что вы не получаете ожидаемые данные? Попробуйте сбросить $ html, чтобы увидеть, действительно ли там находится то, что вы ищете.

person SilverSnake    schedule 11.07.2012
comment
Благодарность! Я не видел это сообщение входа в систему, это полностью сэкономило мне много времени, ха - person Leg0; 11.07.2012
comment
Большое спасибо! Второй - именно то, что я искал :) - person Leg0; 12.07.2012