2013-04-23 4 views
-1

У меня есть следующий текст и вы хотите получить 'canacad.ac.jp_dqrg6k9pg1s879somecodekj88c8% 40group.calendar.google.com', который после src =.Как извлечь часть текста с помощью php

Является ли REGEX способом?

$text ='<iframe src="http://www.google.com/calendar/embed?src=canacad.ac.jp_dqrg6k9pg1s879somecodekj88c8%40group.calendar.google.com&ctz=Asia/Tokyo" style="border: 0" width="800" height="600" frameborder="0" scrolling="no"></iframe>'; 

Заранее спасибо.

ответ

2

Используйте регулярные выражения.

preg_match("/\\?src=([^&\"]+)/i", $text, $results) 
var_dump($results) 
+0

Не получит то, что он хочет. – Loamhoof

+0

@Loamhoof, исправлено, спасибо. –

+1

Вы можете включить еще одну проверку. Если нет других параметров получения: '[^ &"] ' – Loamhoof

1

Regex, вероятно один путь:

$src = preg_replace('(.*?(?<==)([^&"]+).*)i', '\\1', $text); 

Однако я хотел бы дать следующий намек путь: разделите властвуй. Разделите проблему на более мелкие и затем решите общую проблему. Это работает для многих проблем. В качестве примера:

  • Первый: Получить SRC значение атрибута из строки

Есть тысячи способов сделать это, вкл. обычные выражения. Как регулярное выражение было бы предположить, строка всегда форматируется таким образом, и извлечение значения атрибута URL на самом деле тривиально, я использую другую функцию, которая поддерживает регулярные выражения: sscanf:

$url = sscanf($text, '<iframe src="%[^"]')[0]; 

# string(126) "http://www.google.com/calendar/embed?src=canaca.../Tokyo" 

Так что теперь URL уже извлечены. Поскольку это URL-адрес, его можно обрабатывать со стандартными функциями URL. Давайте посмотрим:

  • Второе: Разбираем запрос из URL

Чтобы получить значение SRC из URL можно использовать регулярное выражение снова. Однако, поскольку PHP имеет функции, специфичные для обработки URL-адресов, я использую их вместо этого. Я могу точно сказать, что мне нужно с parse_url. И на этот раз мне в первую очередь нужен код . То есть та часть, которая имеет переменный запрос после знака вопроса:

$query = parse_url($url, PHP_URL_QUERY); 

# string(89) "src=canacad.ac.jp_dqrg6k9pg1s879somecodekj88.../Tokyo" 

Это уже один шага к значению мы ищем. Таким образом, есть еще один шаг, чтобы сделать:

  • Третье: Разбираем значение SRC из запроса

Здесь снова PHP имеет встроенную функцию, чтобы сделать это. Мы можем извлечь все переменные в запросе из URL с помощью функции parse_str. Как он возвращает результаты через параметр функции, это сейчас нужно две строки кода:

parse_str($query, $vars); 
$src = $vars['src']; 

# string(68) "[email protected].com" 

и теперь в переменной $src значение, которое вы ищете.

Вот весь код сверху на первый взгляд:

$text = '<iframe src="http://www.google.com/calendar/embed?src=canacad.ac.jp_dqrg6k9pg1s879somecodekj88c8%40group.calendar.google.com&ctz=Asia/Tokyo" style="border: 0" width="800" height="600" frameborder="0" scrolling="no"></iframe>'; 


$url = sscanf($text, '<iframe src="%[^"]')[0]; 
$query = parse_url($url, PHP_URL_QUERY); 

parse_str($query, $vars); 
$src = $vars['src']; 

var_dump($url, $query, $src); 

Выход следующим образом, показывая все три шага:

string(126) "http://www.google.com/calendar/embed?src=canacad.ac.jp_dqrg6k9pg1s879somecodekj88c8%40group.calendar.google.com&ctz=Asia/Tokyo" 
string(89) "src=canacad.ac.jp_dqrg6k9pg1s879somecodekj88c8%40group.calendar.google.com&ctz=Asia/Tokyo" 
string(68) "[email protected].com" 

Таким образом, независимо, какие функции вы используете в каждом из этих шагов : если вы разделите проблему на более мелкие части, вы почти всегда сможете решить большие проблемы. А также, если есть проблема на одном из подэтапов, вам нужно только исправить один шаг - не всю операцию. Если вы используете одно регулярное выражение для выполнения всей этой работы, у вас будет единственная точка отказа (и создание хорошего регулярного выражения в мире HTML и URL-адресов является нетривиальным, поэтому оно, вероятно, сломается).

Идеальное решение должно использовать HTML-парсер для первого шага, например. Например, с Tidy extension или с популярным расширения DOMDocument:

// Tidy (non error-checked): 
$url = tidy_parse_string($text)->body()->child[0]->attribute['src']; 

// DOMDocument (non error-checked): 
$url = @DOMDocument::loadHTML($text)->getElementsByTagname('iframe') 
      ->item(0)->getAttribute('src'); 

HTML анализатор имеет преимущество в том, что понимать HTML элементы. Вы можете искать определенные элементы и атрибуты, даже если их позиция меняется.

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