REGEXP hata ( Google tarzı arama sonucu gösterme(kelimenin geçtiği cümleyi gösterme) )
Googleda örneğin bir kelime girerek arama yaptığımızda sonuçlar aşağıdaki şekilde listeleniyor.
title
url
description
Description kısmında aranan kelimenin/kelimelerin geçtiği CÜMLELER vb. listeleniyor
Benzer yapıyı aşağıdaki regex komutuyla yapmayı denedim ancak arama yapılacak metinde değişiklik yapınca mesela karakter eksiltince nedenini anlamadığım bir hatayla karşılaştım hatanın nedeni veya çözümü
veyahut alternatif bir regex yazabilecek bi babayiğit arkadaşımız var mıdır :) ?
Varsa şimdiden teşekkürler
HATALI KOD
<?php
$aranan = 'asd';
$metin = 'Deneme Deneme Deneme xxxxxxxxxx1 Deneme Deneme Deneme Deneme Deneme Deneme Deneme Deneme Deneme Denemeeeeee Denemee Denemee Deneme Deneme Deneme Deneme Denemeeeeeeeee Deneme Deneme Denemeeeeeeeeeeee';
$ayrac = '(?:[!?.;]+)';
$regex = '(?:[^!?.d]|d*.?d+)*';
preg_match_all("#{$ayrac}({$regex}{$aranan}{$regex})(?={$ayrac})#si", '!'.$metin, $dizi);
var_dump($dizi);
/*
ÇIKTISI
Bu siteye ulaşılamıyor
ERR_CONNECTION_RESET
*/
?>
HATANIN OLMADIĞI KISIM
<?php
$aranan = 'asd';
$metin = 'Deneme Deneme Deneme xxxxxxxxxx Deneme Deneme Deneme Deneme Deneme Deneme Deneme Deneme Deneme Denemeeeeee Denemee Denemee Deneme Deneme Deneme Deneme Denemeeeeeeeee Deneme Deneme Denemeeeeeeeeeeee';
$ayrac = '(?:[!?.;]+)';
$regex = '(?:[^!?.d]|d*.?d+)*';
preg_match_all("#{$ayrac}({$regex}{$aranan}{$regex})(?={$ayrac})#si", '!'.$metin, $dizi);
var_dump($dizi);
/*
ÇIKTISI
Aranan kelime metin içerisinde geçmediği için
Dizi boş gelsede sorun yok çalışıyor.
*/
?>
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (1)
şöyle bir fonksiyon yazdım senin için
function highlight($string, $keyword){
return preg_replace('/(' . $keyword . ')/iu', '<mark>$1</mark>', $string);
}
kullanırkende
$string = 'prototurk.com. Prototürkte yer alan, web dilleriyle ilgili referans JSON dosyalarının yer aldığı repodur. Siz de bu reponun gelişmesine katkı ProTotÜrk sağlayarak Türkçe';
$keyword = 'prototurk';
echo highlight($string, $keyword);
bu sana şöyle bir çıktı verir
gördüğün gibi aradığım kelime prototurk
olduğu için Prototürk
ve ProTotÜrk
ile eşleşmedi. O yüzden ufak bir düzenleme yapıp şöyle denersen;
function highlightTurkish($string, $keyword){
$characters = ['(ü|u)', '(ö|o)', '(ğ|g)', '(ı|i)', '(ç|c)'];
$keyword = str_replace(
['u', 'o', 'g', 'ı', 'c', 'ü', 'ö', 'ğ', 'i', 'ç'],
array_merge($characters, $characters),
mb_strtolower($keyword, 'UTF-8')
);
return preg_replace('/(' . $keyword . ')/iu', '<mark>$1</mark>', $string);
}
ve şöyle kullanırsan
$string = 'prototurk.com. Prototürkte yer alan,
web dilleriyle ilgili referans JSON dosyalarının
yer aldığı repodur. Siz de bu reponun gelişmesine katkı ProTotÜrk sağlayarak Türkçe';
$keyword = 'prototurk';
echo highlightTurkish($string, $keyword);
başarı kaçınılmaz oluyor :) kolay gelsin.