поиск многомерного массива в строке, чтобы проверить, существуют ли связанные слова php - PullRequest
0 голосов
/ 11 января 2020

Я хочу сделать поиск глагола внутри текста.

$conjugation=array();
$conjugation[0]=array("sein","bin","bist","ist","war","gewesen");
$conjugation[1]=array("haben","habe","hast","hat","hatte","gehabt");
$conjugation[2]=array("lesen","lese","liest","liest","las","gelesen");
$conjugation[3]=array("gehen","gehe","geht","gehts","ging","gegangen");

Я хочу найти каждое спряжение глагола в тексте и извлечь его с замененными спрягаемыми глаголами

  $string="Ich habe das Buch gelesen. Du hast einen apfel. Sie ist nicht gegangen";

  ...<span title='gehen'>gegangen</span>...

, чтобы проверить, что это спряжение принадлежит глаголу ...

Я думал использовать in_array() для их поиска, но не могу получить ожидаемые результаты ...

$words = split(" ", $string); 
$searchWords = $conjugation[0];


  for($x = 0,$l = $count; $x < $l;) { 

  echo $words[$x++]." ";

    if(in_array($words[$x++], $searchWords)) {
        $word1=$x - 1;
            echo "<span title='$verb[0]'> $words[$word1]"."</span>";
    }
  }

Как бы я получил то, что ожидал?

ОЖИДАЕМЫЙ ВЫХОД

 Ich <span title='haben'>habe</span> das Buch 
 <span title='lesen'>gelesen</span>. 
 Du <span title='haben'>hast</span> einen apfel. 
 Sie <span title='sein'>ist</span> nicht <span title='gehen'>gegangen</span>

Ответы [ 2 ]

0 голосов
/ 11 января 2020

Вы можете использовать preg_replace_callback, чтобы найти любое из этих слов и заменить их соответствующим <span>:

foreach ($conjugation as $verbConjugations) {
  $pattern = '/\b(?<word>' . implode('|', $verbConjugations) . ')\b/i';
  $string = preg_replace_callback($pattern, function ($matches) use ($verbConjugations) {
    return "<span title='{$verbConjugations[0]}'>{$matches['word']}</span>";
  }, $string);
}

echo $string;

Демонстрация: https://3v4l.org/AiJE9

0 голосов
/ 11 января 2020

Создайте ассоциативный массив, который сопоставляет спряжения с их глаголами. Затем используйте это для создания замен.

$verb_map = array();
foreach ($verb as $i => $v) {
    foreach ($conjugation[$i] as $w) {
        $verb_map[$w] = $v;
    }
}
$words = explode(' ', $string);
$new_words = array();
foreach ($words as $w) {
    $lower_word = preg_replace('/[^a-z]/', '', strtolower($w));
    if (isset($verb_map[$lower_word])) {
        $new_words[] = "<span title='{$verb_map[$lower_word]}'>$w</span>";
    } else {
        $new_words[] = $w;
    }
}
$new_string = implode(' ', $new_words);
echo $new_string;

DEMO

И вообще, вам следует избегать создания нескольких массивов со связанными данными. Объедините их в многомерный массив:

$verbs = array(
    array("verb" => "haben", "conjugation" => array("habe","hast","hat","hatte","gehabt")),
    array("verb" => "sein", "conjugation" => array("bin","bist","ist","war","gewesen")),
    ...
);
...