Değişkene atmaktan ziyade birçok farklı çözüm yolu vardır aslında. ColumnDefs ayarı ile column a varsayılan bir template vererek render sayesinde gelen değeri kontrol edip butonu aktif/pasif yapabilirsiniz. Belki yine rowCallback ile buna benzer bir işlem yapılabilir. Server side veya statik bir tablo mu kullanıyorsunuz?
var sayi1 = parseInt(document.getElementById(sayi1));
var sayi2 = parseInt(document.getElementById(sayi2));
Bu kullanım hatalı, div elemanının sayı değerini almaya çalışıyorsun. id değerini input a ver ve ardından value sunu al.
var sayi1 = +document.getElementById(sayi1).value
var sayi2 = +document.getElementById(sayi2).value
Üzerinde epeyi uğraştım, son hâlini alana kadar türlü revizyondan geçti. Ama yine de yüzde yüz engellemeyebilir. Aklıma geldiği kadarını eklemeye çalıştım.
class Filter
{
protected $dosya;
const STARS = '*****';
public function __construct()
{
$this->dosya = json_decode(file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'filtre.json'), true)['kelimeler'];
}
private function explode($words)
{
$list = ['.',',',':',';','!','?','=','-','_','/','\\','%','&','(',')','{','}','[',']','\'','"','*','+','^','#','$','@','₺','€'];
$words = trim(str_replace($list, ' ', $words));
preg_match_all('/(\b\S+\b)/u', $words, $matches);
$recursive = function ($arg, $k, $v) use (&$recursive) {
static $arr;
$newArr = array_chunk($arg, $k);
$newStr = mb_strtolower(implode(' ', $newArr[0]));
$arr[$newStr] = in_array($newStr, $v);
array_shift($arg);
if (count($arg) && count($arg) >= $k) {
$recursive($arg, $k, $v, $arr);
}
return $arr;
};
$results = [];
if (count($this->dosya)) {
foreach ($this->dosya as $k => $v) {
$results = $recursive($matches[0], $k, $v);
}
}
return $results;
}
/**
* @param $username
* @return void
* - Bu metod usernameFilter metodunun test hâlidir, yasaklı kelime ile eşleştiğinde echo ile yazdırabilmek için kullan, asıl çalışan metod üstteki, testten sonra bu metodu silebilirsin
*/
public function usernameFilterForTest($username)
{
$results = $this->explode($username);
if (count($results)) {
foreach ($results as $k => $v) {
if ($v) {
echo "Yasaklı kelime bulundu. Eşleşen kelime <b>$k</b><br>";
// Kullanıcı adı yasaklı kelimeler listesinde bir şekilde var
// Kullanıcı adı bir kelime veya bir kelimeden fazla ise bile eşleşme sağlanıyor. 3 kelimeli bir ad olsa ve son iki kelimesi, yasaklı kelimeler listesinin 2 kelimelik listesinde varsa bile eşleşme sağlanır
}
}
}
}
/**
* @param $comment
* @param bool $one2oneFilter - Yorum içerisinde bulunan yasaklı kelimelerin kendi harf sayılarına göre filtrelenme seçeneği. Örneğin yasaklıKelime kelimesi bulunduğunda bu değer true ise kendi harf sayısı kadar * koyulur *************; false ise alttaki STARS sabitindek, kadar yıldız koyulur
* @param bool $forceFilter - Bu da aslında sizin 'komple bir metnin içeriğinde kelime avına çıkma' isteğiniz için bir seçenek. true verilirse yasaklı bir kelime başka bir kelimenin içinde bulunsa bile filtrelenir. false ise sadece tam olarak bir kelime şeklinde yasaklı listesinde varsa filtrelenir
* @return array|string|string[]|null
*/
public function commentFilter($comment, bool $one2oneFilter = true, bool $forceFilter = false)
{
$results = $this->explode($comment);
$filter = array_filter($results, function ($item) {
return $item;
});
$h = array_map(function ($item) use ($forceFilter) {
if ($forceFilter)
return "/$item/i";
else
return "/\b$item\b/i";
}, array_keys($filter));
if ($one2oneFilter) { // Eğer * işaretlerini filtrelenen kelimenin tam harfleri ile uyumlu şekilde koymak istiyorsak
$replacemenet = [];
for ($i = 0; $i < count($h); $i++) {
$str = '';
if ($forceFilter)
$a = substr($h[$i],1, -2);
else
$a = substr($h[$i],3, -4);
$p = explode(' ', $a);
foreach ($p as $item) {
$str .= str_repeat('*', mb_strlen($item)) . ' ';
}
$replacemenet[] = $str;
}
$response = preg_replace($h, $replacemenet, $comment);
}
else
$response = preg_replace($h, self::STARS, $comment);
return $response;
}
/**
* @param $username
* @return bool
* - Kullanıcı adında yasaklı kelimeler varsa false yoksa true döndürür
*/
public function usernameFilter($username): bool
{
$username = trim($username);
preg_match_all('/\pL+/u', $username, $matches);
$results = $this->explode($matches[0]);
if (count($results)) {
foreach ($results as $v) {
if ($v)
return false;
}
}
return true;
}
}
// Bir defa oluşturduktan sonra aşağıdaki kısmı silebilirsin
###################################
// Örnek bir yasaklı kelimeler json dosyası oluşumu. Yasaklı kelimeleri içerdikleri kelime sayılarına göre gruplandırdım. Yazdığım sınıfta buna göre bütün yasaklı kelimeleri verilen yorum veya kullanıcı adındaki kelimeleri bu listede bulunan harf sayılarına göre teker teker bölüp arıyor.
$kelimeler = [
'kelimeler' => [
1 => [
'kaybol',
'yasaklıKelime',
'sarkozy',
'sak1z',
'yani',
],
2 => [
'tuvalet terliği',
'naylon poşet',
'yasaklı kelime'
],
3 => [
'yasaklı bir kelime',
'üç kelime yasaklı',
'elli birinci bölge'
],
4 => [
'zincirleme k1üfür içeren kelimeler'
]
]
];
file_put_contents('filtre.json', json_encode($kelimeler, JSON_UNESCAPED_UNICODE));
###################################
// Biraz gereksiz kod tekrarı olmuş olabilir, olabildiğince kkısa yollarla halletmeye çalıştıkça türlü sıkıntılar çıktı. Çook uzun yorumlarda belki ufak bir gecikme sorunu yaşanabilir emin değilim. Çünkü yorumu çok fazla parçaya ayırıp kontrol etmeye çalışacak. Umarım işinize yarar.
$username = 'yasaklı kelime içeren kullanıcı adı';
$filter = new Filter();
//$filter->usernameFilterForTest($username);
/******* if ($filter->usernameFilter($username)) {
// Sonuç başarılı, yasaklı kelime çıkmamış, bu kullanıcı adıyla kayıt olabilir
echo 'başarılı';
}
else {
// Sonuç başarısız, kullanıcı adının içinde bir şekilde yasaklı kleime tespit edildi, bu kullanıcı adıyla kayıt olamaz
echo 'Başarısız';
}*******/ // Orijinal kullanıcı adı kontrolü
$comment = 'Bu yorumun içerisinde yasaklı kelimeler bulunabilir. İçinde sayı olan yasaklı kelimeler de olabilir, mesela sak1z gibi. Örneğin sarkozy kelimesi yasaklı bir kelimedir ve filtrelenecektir. Aynı şekilde naylon poşet de yasaklı kelime listesinde mevcuttur.Zincirleme k1üfür içeren kelimeler de filtrelenir :) Yani kelimesi tek başına filtrelenir ama malayani veya süryanice gibi içerisinde bulunuyorsa filtrelenmeyebilir.';
$filteredeComment = $filter->commentFilter($comment);
echo "<b>Sadece tam eşleşmeler filtrelenmiş hâli</b>: $filteredeComment";
echo '<br><br>';
$filteredeComment = $filter->commentFilter($comment, forceFilter: true); // PHP 8 sözdimizi. Eğer PHP 8 değilse senin sürüm alttki yorum satırındakini kullan
//$filteredeComment = $filter->commentFilter($comment, true, true);
echo "<b>Bütün eşleşmelerin filtrelenmiş hâli</b>: $filteredeComment";
echo '<br><br>';
echo "<b>Orijinal metin</b>: $comment";
Class Filtre
{
public $dosya;
public function __construct()
{
$this->dosya = json_decode(file_get_contents(__DIR__ . DIRECTORY_SEPARATOR . 'filtre.json'), true);
}
public function filter($sentence): bool
{
$filtreWords = explode(' ', $sentence);
$filtered = array_filter($filtreWords, function ($item) {
return in_array($item, $this->dosya['kelimeler']);
});
return (bool) count($filtered);
}
}
$kelime = "Uzaylı seni yakalarsam ****** içinden geçerim";
$Filtre = new Filtre();
print_r($Filtre->filter($kelime));
Mesela böyle basit bir şey yaptım, eğer verilen cümlede TAM EŞLEŞEN bir kelime varsa true yoksa false döndürür
Buralardayım hocam, baktım gönderinize birazcık uğraştım da ama tam olarak ne yapmak istediğinize kanaat getiremedim :) Class a verilen cümle içerisinde filter.json dosyasında belirtilen kelimelerden TAM OLARAK uyuşanı varsa true yoksa false mı döndüreecek. Ya da daha spesifik bir şekilde; verilen cümlede kaç tane olduğunun önemi olmadan *** lı kelime olsa da mı döndürecek vs biraz detaya ihtiyacım var. Biraz kıt anlıyorum ben :)
Teşekkür ederim :) Mobilden yazmıştım kopyala yapıştır yapıp, syntax a dikkat etmemiştim.
toastr.options = {
"closeButton": true,
"debug": false,
"newestOnTop": false,
"progressBar": true,
"positionClass": "toast-bottom-left",
"preventDuplicates": false,
"onclick": null,
"showDuration": "300",
"hideDuration": "1000",
"timeOut": "5000",
"extendedTimeOut": "1000",
"showEasing": "swing",
"hideEasing": "linear",
"showMethod": "fadeIn",
"hideMethod": "fadeOut",
onHidden: function () {
window.history.pushState('', '', location.href.split('?')[0])
}
}
https://regex101.com/r/xBROiT/1
Bir de böyle deneyin. Bu defa referans olarak sayıdan sonra gelen . işaretini aldık. Url lerin hepsinde aynı olan bir ortak özellik bulmamız lazım. Yoksa birden fazla yönlendirme koşulu yazılabilir.
Yani htaccess regex usulü çalışıyor bildiğim, böyle bir expression ile test ortamlarında eşleşmeyi sağladık. Gerçek bir htaccess ortamında deneyemediğim için bilemeyeceğim