PHP str_replace с array () получает вложенную замену замененных значений - PullRequest
0 голосов
/ 29 октября 2018

Я хочу заменить слова теговыми словами в тексте.

tbl_glossary
id  word
1   apple pie
2   apple
3   juice

Слова находятся в массиве из базы данных (MySQL). Затем слово заменяется замененным словом, если слово содержит то же значение (например, «яблочный пирог» содержит «яблоко»).

$con = mysqli_connect(db_host, db_username, db_password, db_name);
$sql = "SELECT * FROM `tbl_glossary`";
$res = mysqli_query($con,$sql);
while($row = mysqli_fetch_array($res)){
    $arr_taggedword[] = '<a href="#" data-toggle="tooltip" id="'.$row['id'].'">'.$row['word'].'</a>';
    $arr_word[] = $row['word'];
}

$text = "apple pie made with apple juice";

$results = $text;
foreach($arr_word as $key => $value) {
    $results = str_replace($value, $arr_taggedword[$key], $results);
}
echo $results;

Тогда результат отображается как

<a href="#" data-toggle="tooltip" id="1"><a href="#" data-toggle="tooltip" id="2">apple</a> pie</a> made with <a href="#" data-toggle="tooltip" id="2">apple</a> <a href="#" data-toggle="tooltip" id="3">juice</a>

'яблочный пирог' является вложенным. Любая идея пропустить / игнорировать замененные слова, чтобы получить заменены снова?

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

1 Ответ

0 голосов
/ 29 октября 2018

Вы можете использовать форму массива strtr, он будет выполнять все ваши замены в порядке от наибольшего к наименьшему, но также не заменяет текст, который уже был заменен. Замените цикл foreach на:

$results = strtr($text, array_combine($arr_word, $arr_taggedword));
echo $results;

выход

<a href="#" data-toggle="tooltip" id="1">apple pie</a> made with <a href="#" data-toggle="tooltip" id="2">apple</a> <a href="#" data-toggle="tooltip" id="3">juice</a>
...