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 элементы. Вы можете искать определенные элементы и атрибуты, даже если их позиция меняется.
Не получит то, что он хочет. – Loamhoof
@Loamhoof, исправлено, спасибо. –
Вы можете включить еще одну проверку. Если нет других параметров получения: '[^ &"] ' – Loamhoof