Регулярное выражение для пользовательского поиска (PHP)

123
Sanu0074
На сайте с 31.08.2012
Offline
110
#11

siv1987, так вот выглядит код

if(strlen($str)>=1){

if(substr($str,0,1)==":"){ //если выражение
echo $str.'<br>';
$param = array();

preg_match_all('/:([\w_]+)\s*([<>=]{1,2})\s*(["\'].*?["\']|[^\s()]+)/', $str, $out);
for($i=0; $i<count($out[0]); $i++){
$key = $out[1][$i];
$sign = $out[2][$i];
$val = $out[3][$i];

$str = str_replace($out[0][$i], $key.(($sign == '=') ? ' LIKE' : $sign).' ?', $str);
$param[] = "%".$val."%";
}

echo $str.'<br>';
console($param);
exit;

то что выводится в браузер на картинке

png result.png
siv1987
На сайте с 02.04.2009
Offline
427
#12

И немного изварата

'/(^|[&]{2}|[|]{2})\s*(\(*)\s*:([\w_]+)\s*([<>=]{1,2})\s*(["\'].*?["\']|[^\s()]+)\s*(\)*)/'

чтобы разбить выражение на составляющие и написать свой конструктор


Array
(
[0] => Array
(
[0] => :name=первая
[1] => && (:id>40
[2] => && :sect=content)
)

[1] => Array
(
[0] =>
[1] => &&
[2] => &&
)

[2] => Array
(
[0] =>
[1] => (
[2] =>
)

[3] => Array
(
[0] => name
[1] => id
[2] => sect
)

[4] => Array
(
[0] => =
[1] => >
[2] => =
)

[5] => Array
(
[0] => первая
[1] => 40
[2] => content
)

[6] => Array
(
[0] =>
[1] =>
[2] => )
)

)
$param[] = "%".$val."%";

А если нужно точное совпадание? Я бы использовал id==40 для точного поиска без %%.

но почемуж в моем скрипте непашет как надо

Возможно символы <> кодируются по разному в разных кодировках (как вариант).

Sanu0074
На сайте с 31.08.2012
Offline
110
#13
siv1987:
А если нужно точное совпадание?

тут можно проверять, если is_numeric - те не подставлять %%, а в иных случаях подставлять, я так подумал сделать...

siv1987:
Возможно символы <> кодируются по разному в разных кодировках (как вариант).

У вас какая кодировка? у меня utf8

siv1987
На сайте с 02.04.2009
Offline
427
#14
тут можно проверять, если is_numeric - те не подставлять %%, а в иных случаях подставлять, я так подумал сделать...

Не правильно думайте, так как это может быть и строка, а может быть наоборот число которое нужно искать в подстроке.

У вас какая кодировка? у меня utf8

И на форуме утф. А ваше выражение возможно приходит в другой кодировке. Хотя это в порядке бреда, так как если я не ошибаюсь эти символы кодируются одинаково и в cp1251. Смотрите побайтого на строку.

Sanu0074
На сайте с 31.08.2012
Offline
110
#15

siv1987, а как правильно в регэксп подставить эти знаки в hex формате - 3E и 3C ? может тогда заработает..

siv1987
На сайте с 02.04.2009
Offline
427
#16
Sanu0074
На сайте с 31.08.2012
Offline
110
#17

siv1987, так ничего не изменилось:

preg_match_all('/:([\w_]+)\s*([\x3C\x3E=]{1,2})\s*(["\'].*?["\']|[^\s()]+)/', $str, $out);
Sanu0074
На сайте с 31.08.2012
Offline
110
#18

А вот если так регулярку запилить:

/:([\w_]+)\s*([^<>=]{1,2})\s*(["\'].*?["\']|[^\s()]+)/

то вывод такой (тот же пример)

png xxxxx.png
Sanu0074
На сайте с 31.08.2012
Offline
110
#19

работает, но тут приклеиваются лишние символы в начало

---------- Добавлено 09.01.2015 в 00:39 ----------

тут конечно можно сделать str_replace в $val символов "t;" и "=", но всеже как в регулярке это сделать?

siv1987
На сайте с 02.04.2009
Offline
427
#20

Не надо дергать регулярку - там все нормально. Копайте свою строку.

123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий