Kullanıcı girişi değiştirmek için düzenli ifade

5 Cevap php

Benim veritabanında bir arama yapıyorum. Kullanıcı, örneğin girerse. "Foo bar" Ben "foo" ve "bar" hem de sahip satırları görüntülemek istiyorum.

My SQL syntax looks like this: SELECT * FROM t1 WHERE MATCH (t1.foo_desc, t2.bar_desc) AGAINST ('+foo* +bar*')

PHP nasıl bir düzenli ifade kullanarak "+ foo * + bar *" içine kullanıcı girişi "foo bar" değiştirebilirim?

5 Cevap

$match = '+' . implode('* +', explode(' ', $input)) . '*';

Bu giriş boş bir dize olduğunu varsayar;

Edit: @ Bart S işaret ettiği gibi, str_replace (veya çokbaytlı karakterlerle uğraşıyoruz eğer mb_str_replace) bile kolay olurdu ...

$match = '+' . str_replace(' ', '* +', $input) . '*';

Sen \b kullanmak gerekir ve \B kelime / değil-kelime sınırlarını tespit etmek, ve böylece + / * takın.

Öncelikle, kullanıcı girişi Döşeme ve garip bir şey (noktalama işaretleri, tırnak, tabii boşluk dışında temelde her şey "\W",) çıkarın.

Sonra, yerine:

(?<=\w)\b

ile

"*"

ve:

\b(?=\w)

ile

"+"

Eğer daha önce kullanmadıysanız MAÇ ilgilenenler için ... sözdizimi KARŞI This article iyi bir başlangıç ​​noktasıdır.

I * + iki kelime arasında boşluk yerine normal ifadeyi kullanabilirsiniz:

'+' . preg_replace('/\s+/', '* +', trim($input)) . '*'

Edit Temelde bu sadece \s yerine ile what Tomalak said bir uygulamasıdır \W.