после preg_match_all, как получить значение, если оно находится в другой строке

Моя миссия — получить желаемую дату, когда будет упомянуто конкретное слово. Я хочу указать дату, когда в качестве примера можно привести spelmissbruk, так что я бы хотел 29.07.2014, и это работает так, как я хочу.

22/10/2013 ånger, ska bet 6428: -,
ставка 6428, 2109 + 2016 + 2303
23/5/2014 bl 26/5, medd inga avgifter)
29.07.2014 spelmissbruk
29/12/2014 föreslår godkänn
27/4/2016 Föreslår godkänn

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

spelmissbruk
29/7/2014

Это код, который я сейчас использую, чтобы извлечь нужную дату. Любые советы будут оценены.

$ subject = $ row ['anteckning'];


$ pattern = $ wordToFind;
if (preg_match_all ("/ (\ d {1,2} \ / \ d {1,2} \ / \ d {4}). * $ pattern. * / i", $ subject, $ match)) {

$ date = $ match [1] [0];

}

Ниже приведен пример даты, которая не будет сохранена как я хочу

12/7/2018 - Кунд Рингер, хар фахт хем фактуран мэн кэннер эй джен ден. Kund Uppger att det ej är han som tagit lånet. Kund har ej fått hem andra fakturor eller någon kreditupplysning. Сведбанк от 15 до 15:00: - Смотри, как дела в седьмом небе от седьмого века до конца света. Meddelat att ansökan är identifierad.
Бетт кунд тэг контакт мед банк син, бизноде, полисанмалан и скицка полисанмалан до осс.

Это то, что я пытался сделать

$ move_date = preg_replace ("(\ d {1,2} \ / \ d {1,2} \ / \ d {4})", "-", $ subject)

$ explodeDate = explode ("-", $ move_date);
print_r ($ explodeDate);

Моя идея — взорвать его и кое-как удалить все строки.

Здесь у меня есть пример текста, когда дата не будет сохранена, это из-за форматирования строки. Что я ищу, так это слово «полис», и если оно совпадает, остановитесь и получите дату.

12/7/2018 - Софи: звонит Кунд, хар фахт хем фактуран мэн каннер эй джен ден. Kund Uppger att det ej är han som tagit lånet. Kund har ej fått hem andra fakturor eller någon kreditupplysning. Сведбанк от 15 до 15:00: - Смотри, как дела в седьмом небе от седьмого века до конца света. Meddelat att ansökan är identifierad.
Бетт кунд тэг контакт мед банк син, бизноде, полисанмалан и скицка полисанмалан до осс.

вот текст, который сохранит дату как я хочу

25/7/2018 - Софи: детта ар бедрегери, кунд сон хаде гьорт бедрегери па кунд, кунд хар полисанмалт, спаррат син банкдоса осв. Pengarna finns kvar på kunds konto, Áven ifrån andra bolag. Meddelat 25000: -, затем шлюха. Кунд Беталар Детта Идаг. Lagt в spärr på кундс бегаран

2

Решение

Во-первых, вам нужно использовать s модификатор, так что. Символ ищет многострочное совпадение. Во-вторых, не используйте .* потому что в вашем случае это всегда будет соответствовать только первое свидание. В-третьих, используйте preg_quote цитировать специальные символы из строки, которую вы хотите найти.

В качестве полного примера попробуйте этот:

// To avoid errors or unexpected results, we must escape regex characters
// For example, without this we cannot find some punctuation marks
$search = preg_quote('polis', '#');

// A simple regular expression to find the date
// Since we have to use it twice, we do not repeat ourselves
$date_rgxp = '\d{1,2}/\d{1,2}/\d{4}';

// Now it’s time to capture our date, for this we are using a more complex regex
// - Use "#" as delimiter, as it will allow do not escape "/" from the $date_rgxp
// - Use a named group to capture the date (it can be written as "($date_rgxp)", but in this case we should print it as "$m[1]" which is not so good for readability)
// - There can be any characters between the date and search word, but it should not contain another date (to solve this we are using negative lookahead "(?:(?!{$date_rgxp}).)+" instead of ".*")
// - Use the "si" modifiers to perform a case-insensitive multi-line search
if (preg_match("#(?P<date>{$date_rgxp})(?:(?!{$date_rgxp}).)+{$search}#si", $subject, $m)) {
echo $m['date'];
}
0

Другие решения

Вот рабочий код, который я протестировал с тремя случаями:

  1. Случай 1, дата впереди, которую вы уже сделали.
  2. Случай 2, дата в конце, я просто сделал небольшую модификацию первого.
  3. Случай 3, дата в новой строке, которая поясняется ниже.

preg_match_all имеет флаг под названием PREG_OFFSET_CAPTURE который будет возвращать смещение захваченного шаблона, тогда у той же функции есть параметр смещения, который можно установить, поэтому я искал шаблон для случаев 1 и 2, если не найден, затем выполнял поиск шаблона с PREG_OFFSET_CAPTURE, затем выполните второй поиск, на этот раз используйте вывод PREG_OFFSET_CAPTURE пометить как смещение и вернуть дату, которая является единственной в строке.

Надеюсь, что это решение поможет вам.

<?php

$subject = "22/10/2013 ånger, ska bet 6,428:-,
bet 6428, 2109+2016+2303 inlagt
23/5/2014 bl 26/5, medd inga avgifter)
spelmissbruk
29/7/2014
29/12/2014 föreslår godkänn
27/4/2016 Föreslår godkänn
CUSTOM TESTx 27/12/2018
27/12/2018 - CUSTOM TEST
TESTVAL
05/12/1987";
$pattern = '- CUSTOM';
$search = TRUE;

/*Make sure you are searching a valid pattern*/
if(!preg_match_all("/.*$pattern.*/",$subject, $matches)){
echo "NO PATTERN MATCH";

}
/*Search the case that the date infront of the text*/
if(preg_match_all("/(\d{1,2}\/\d{1,2}\/\d{4}).*$pattern.*/i",$subject, $matches))  {
$date = $matches[0][0][0];

}
/*Search the case that the date is after the text*/
if(preg_match_all("/.*$pattern.*(\d{1,2}.\/\d{1,2}\/\d{4})/",$subject, $matches))  {
//echo "MATCH LAST";
$date = $matches[0][0][0];
}
if(preg_match_all("/.*$pattern.*/",$subject, $matches,PREG_OFFSET_CAPTURE )){
//echo " CAPTURED OFFSET ".$matches[0][0][1];
if(preg_match_all("/(\d{1,2}.\/\d{1,2}\/\d{4})/",$subject, $dateMatches,PREG_OFFSET_CAPTURE,$matches[0][0][1]))  {
//echo " CAPTURED OFFSET DATE";
$date = $dateMatches[0][0][0];
}

}

if(isset($date)){
echo $date;
}



?>
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector