Я пытаюсь убрать метаданные из некоторых новостных статей, которые я получил от Lexis Nexis. В настоящее время у меня возникают проблемы с удалением многострочных метаданных, то есть мой шаблон соответствует только первой строке.
Я подозреваю, что это может быть исправлено с помощью негативного взгляда, который ищет несколько разрывов строк, но до сих пор я не смог решить это.
$article = "SECTION: Media; Blz. 33
LENGTH: 355 woorden
HIGHLIGHT: Verkiezingen Robert Jensen keert vanaf vandaag terug op de
Nederlandse televisie. In 'Jensen kiest voor Amerika' onderzoekt hij de
aantrekkingskracht van Donald Trump. Is hij definitief terug of lonkt misschien
een oude liefde?
Waarom ben je Jensen kiest voor Amerika gaan maken?
,,Ik vind Amerika al mijn hele leven een fascinerend land, ben er vaak en volg
de verkiezingen als fenomeen. Toen Trump maar bleef winnen, begon het idee voor
een tv-programma te leven. Ik wilde alles van die Trump-aanhangers weten want
daar hoor je weinig over.''";
preg_match_all( "/[A-Z\h-]+: *[^\r]+/", $article, $matches);
var_dump( $matches[0] );
die();
Результаты в:
array(3) { [0]=> string(23) "SECTION: Media; Blz. 33" [1]=> string(19) "LENGTH: 355 woorden" [2]=> string(70) "HIGHLIGHT: Verkiezingen Robert Jensen keert vanaf vandaag terug op de" }
Как вы можете только первая строка основной момент данные сопоставлены.
Я также разместил полную статью (с несколькими примерами многострочных метаданных) на regex101.
После двух ответов я понимаю, что мой вопрос, возможно, не был полностью ясен — извините за это.
Я пытаюсь удалить / удалить метаданные из $article
так что остается только основная часть статьи. В моем примере я использую preg_match_all()
, Как только я смогу правильно сопоставить метатеги, я буду использовать preg_replace()
заменить его пустой строкой. Я подумал об использовании preg_split (), но я должен был догадаться, какой из элементов массива является фактическим телом — метатег может быть длиннее фактического тела, хотя это маловероятный сценарий.
Так что же метатег? Метатег всегда начинается с [A-Z\h-]+:
и заканчивается пустой строкой, то есть двумя разрывами строки.
Если вы возьмете вышеупомянутый пример и поместите теги в массив, а тело статьи в отдельную переменную, это будет выглядеть так:
<?php
$meta_tags = [
"SECTION" => "Media; Blz. 33",
"LENGTH" => "355 woorden",
"HIGHLIGHT" => "Verkiezingen Robert Jensen keert vanaf vandaag terug op de
Nederlandse televisie. In 'Jensen kiest voor Amerika' onderzoekt hij de
aantrekkingskracht van Donald Trump. Is hij definitief terug of lonkt misschien
een oude liefde?"];
$article_body = "Waarom ben je Jensen kiest voor Amerika gaan maken?
,,Ik vind Amerika al mijn hele leven een fascinerend land, ben er vaak en volg
de verkiezingen als fenomeen. Toen Trump maar bleef winnen, begon het idee voor
een tv-programma te leven. Ik wilde alles van die Trump-aanhangers weten want
daar hoor je weinig over.''";
Дополнительное примечание: После статьи тела могут быть еще несколько метатегов, но preg_replace()
на мета-теги также должны позаботиться об этом.
Поскольку у вас нет сложного соответствия, вы также можете пойти с простым preg_split()
это предназначается для ключей метаданных как разделителей, и не беспокоиться о перспективах и т.д .:
$matches = preg_split( '/\v*([A-Z\h-]+):\h?/', $article, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
Дает тебе:
array(6) {
[0]=> string(7) "SECTION"[1]=> string(14) "Media; Blz. 33"[2]=> string(6) "LENGTH"[3]=> string(11) "355 woorden"[4]=> string(9) "HIGHLIGHT"[5]=> string(556) "Verkiezingen Robert Jensen keert vanaf vandaag terug op de
Nederlandse televisie. In 'Jensen kiest voor Amerika' onderzoekt hij de
aantrekkingskracht van Donald Trump. Is hij definitief terug of lonkt misschien
een oude liefde?
Waarom ben je Jensen kiest voor Amerika gaan maken?
/...snip/"}
… Я уверен, что вы можете обрабатывать достаточно легко, четные значения являются ключами, а шансы являются значениями. ^ _ ^
Но если вы хотите использовать прогноз, вот пример:
preg_match_all('/[A-Z\h-]+:.*?(?=\s*(?:[A-Z\h-]+:|\Z))/s', $article, $matches);
Это соответствует всему, что начинается с вашего мета-ключа, за которым следует что-либо, за которым следует другой мета-ключ или конец ваших данных. Лучше не беспокоиться о совпадении разрывов строк здесь, сопоставьте то, что имеет значение вместо этого. Прогноз может быть упрощен в дальнейшем, чтобы просто (?=[A-Z\h-]+:|\Z)
, но \s*
обрезает конечный пробел в значениях. (И именно поэтому последующая фактическая прогнозная группа указана как ?:
не захватывать, мы не хотим загромождать вывод, теперь мы делаем.) Результат:
array(3) {
[0]=> string(23) "SECTION: Media; Blz. 33"[1]=> string(19) "LENGTH: 355 woorden"[2]=> string(567) "HIGHLIGHT: Verkiezingen Robert Jensen keert vanaf vandaag terug op de
Nederlandse televisie. In 'Jensen kiest voor Amerika' onderzoekt hij de
aantrekkingskracht van Donald Trump. Is hij definitief terug of lonkt misschien
een oude liefde?
Waarom ben je Jensen kiest voor Amerika gaan maken?
/...snip/"}
Но если вы хотите сделать это красиво, скорее сделайте это:
preg_match_all('/([A-Z\h-]+):\h*(.*?)(?=\s*(?:[A-Z\h-]+:|\Z))/s', $article, $matches);
$parsed = array_combine($matches[1], $matches[2]);
То есть мы добавляем группы захвата для ключа и значения, а затем объединяем их в ассоциативный массив. (Убедитесь, что у вас есть совпадения, прежде чем пытаться объединить.) Результат:
array(3) {
["SECTION"]=> string(14) "Media; Blz. 33"["LENGTH"]=> string(11) "355 woorden"["HIGHLIGHT"]=> string(556) "Verkiezingen Robert Jensen keert vanaf vandaag terug op de
Nederlandse televisie. In 'Jensen kiest voor Amerika' onderzoekt hij de
aantrekkingskracht van Donald Trump. Is hij definitief terug of lonkt misschien
een oude liefde?
Waarom ben je Jensen kiest voor Amerika gaan maken?
/...snip/"}
редактировать Если все, что вам действительно нужно, это основной текст (теперь, когда понятно, с чего начинается основной текст: после мета-метки с одним пунктом), и вы не используете метаданные, просто очистите статью с помощью preg_replace
сопоставление всех разделов, начинающихся с мета-ключа, и сопоставление всех до первого двойного (или более) перевода строки. (Использование \v
соответствовать любому вертикальному пространству.)
$article = preg_replace('/([A-Z\h-]+):\h*(.*?)[\v]{2,}/s', '', $article);
Это может быть то, что вы ищете:
^(?P<key>[A-Z]+):
(?P<value>(?:(?!^[A-Z]+:).)+)
Увидеть демо на regex101.com.