[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Регулярное выражение. экранирование кавычки
ruzab
Господа форумчане! Помогите решить вопрос:

Есть код, при помощи которого надо найдти неэкранированную кавычку в строке, например:

"это "просто строка". Т.е. кавычку перед словом _просто_ надо найдти, поскольку она не экранирована.

	 
$str = 'это "просто строка';

if (preg_match("/[^\\][\"]/", $str, $strout)) {

echo "найдена";
//return false;

}



Вардамп выдает в любом случае (экранирована или неэкранирована кавычка):
	 
array(1) {
[0]=>
string(1) "э"
}


Если я правильно понимаю, данный шаблон "/[^\\][\"]/" должен искать любой символ - не обратный слэш, а после него кавычку: и в слуае нахождения такой последовательности preg_match() выдает "1". Если перед кавычкой стоит обратный слэш, т.е. она экранирована preg_match не сработает. Или похоже я ошибаюсь?...



Спустя 1 час, 2 минуты, 44 секунды (26.08.2011 - 15:27) walerus написал(а):
А если искать пустое место с последующей кавычкой ?, что то типа
preg_match( '~\s"~iUs', $text, $match );

Спустя 2 часа, 56 минут, 52 секунды (26.08.2011 - 18:24) ruzab написал(а):
Ну кавычка может быть не обязательно после пустого места smile.gif
Она может быть вообще в тексте - после символа,в конце строки и т.п. Это я здесь просто как пример привел... Может быть и так :

'это "про"сто ст"рока'

Главная задача - найдти неэкранированную кавычку в тексте. Т.е. чтобы preg_match сработал если хотя-бы одна кавычка в тексте была-бы неэкранирована и неважно после чего она идет! Экранированные кавычки не проблема - их может быть скольугодно много.

Спустя 7 минут, 28 секунд (26.08.2011 - 18:31) alex12060 написал(а):
strpos('"', $text);


А так, у тебя выводит так, потому-что срабатывает это условие:

[^\\]


У тебя же нет перед первой буквой символа \? Вот он и вытаскивает и завершает поиск)

Спустя 3 часа, 20 минут, 56 секунд (26.08.2011 - 21:52) ruzab написал(а):
strpos('"', $text);
не подойдет, поскольку можетсодержаться экранированная кавычка \", а она допускается.

alex12060, почему сработает?
[^\\]


Ведь условие такое: обязательно два символа: Любой символ не слэш и следом за ним кавычка:


[^\\][\"]


Я может чего не так понимаю ?

Спустя 24 минуты, 32 секунды (26.08.2011 - 22:17) alex12060 написал(а):
Хорошо, подойди с другого боку:


if (strpos('\"', $str) || strpos("'", $str))


А так, я что-то пока не могу регулярку составить Оо

Спустя 1 час, 29 минут, 10 секунд (26.08.2011 - 23:46) ruzab написал(а):
Тоже не пойдет... Можно в принципе просчитать количество вхождений \" и количество вхождений ", при этом проверив не являются ли " частью \", сравнив найденные позиции, но уж больно это через одно место получается smile.gif


Дело вроде плевое, толькоя сам завис с ним...

Спустя 26 минут, 12 секунд (27.08.2011 - 00:12) twin написал(а):
Дело никакое не палевое... Я как то давно тоже мучался, когда делал это.

Завтра если успею, найду исходник. Вообще я помню, что решение нашел в учебнике Дж.Фридла, рекомендую к прочтению.

Спустя 6 часов, 59 минут, 8 секунд (27.08.2011 - 07:11) Invis1ble написал(а):
вот, наваял
$string = 'Some "\"string\"';
$pattern = '#(?:[^\\\]+|^)(?:\\\\\\\)*"#';
var_dump((bool)preg_match($pattern, $string));

должна корректно справляться также и со случаями экранирования самого слеша

Спустя 1 день, 10 часов, 10 минут, 5 секунд (28.08.2011 - 17:21) ruzab написал(а):
Цитата (twin @ 26.08.2011 - 21:12)
Дело никакое не палевое...

Мда, это уж точно уже битые 3 дня сижу мучаюсь.

Благодарю за учебник, почитаю. Тут видать на чтении обычных статей не выедешь smile.gif

Спустя 3 минуты, 31 секунда (28.08.2011 - 17:25) Winston написал(а):
Цитата (ruzab @ 28.08.2011 - 17:21)
Благодарю за учебник, почитаю

Бери 3-е издание, там PHP присутствует.

Спустя 11 минут, 31 секунда (28.08.2011 - 17:36) ruzab написал(а):
Цитата (Invis1ble @ 27.08.2011 - 04:11)
$string = 'Some "\"string\"';
$pattern = '#(?:[^\\\]+|^)(?:\\\\\\\)*"#';
var_dump((bool)preg_match($pattern, $string));

С кавычкой действительно справляется, а вот экранированный слэш что-то не находит, но его в принципе мне находить и не надо...

И можно поинтересоваться, а зачем такое огромное количество бэкслешей в шаблоне и что в данном случае означает |^ . Начало строки ? :)



Спустя 4 часа, 9 минут, 21 секунда ruzab написал(а):
Цитата (Winston @ 28.08.2011 - 14:25)
Бери 3-е издание, там PHP присутствует.

Спасибо!

Спустя 5 часов, 14 минут, 41 секунда (28.08.2011 - 22:51) Invis1ble написал(а):
ruzab
Цитата
а вот экранированный слэш что-то не находит, но его в принципе мне находить и не надо

я имею ввиду конструкции вроде \\", \\\" и т.п. она отрабатывает нормально, по крайней мере я тестировал - у меня работало, т.е. для \\" выдаст как для неэкранированной кавычки, \\\" - как для экранированной ну и т.д.
Тестирую таким кодом:
$pattern = '#(?:[^\\\]+|^)(?:\\\\\\\)*"#';

for ($i = 0; $i < 4; $i ++) {
$string = 'Some ' . str_pad('', $i, '\\', STR_PAD_BOTH) . '" string';
var_dump((bool)preg_match($pattern, $string));
echo '<br />';
}

Спустя 36 минут, 58 секунд (28.08.2011 - 23:28) neadekvat написал(а):
Я конечно уже упустил нить суждения, но вот проверяет наличие неэкранированной кавычки. Кажется. Или я чето не вкуриваю в задачу.

$str = 'это "просто строка';

if (preg_match('/(?<!\\\)"/', $str, $strout)) {
echo "найдена";
} else {
echo 'all ok';
}

Спустя 13 минут, 8 секунд (28.08.2011 - 23:41) Invis1ble написал(а):
neadekvat
$str = 'это \\"просто строка';

;)

Спустя 1 минута, 55 секунд (28.08.2011 - 23:43) killer8080 написал(а):
ruzab
вот так вроде должно работать
'#^"|[^\\\\]"#'
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.