Есть код, при помощи которого надо найдти неэкранированную кавычку в строке, например:
"это "просто строка". Т.е. кавычку перед словом _просто_ надо найдти, поскольку она не экранирована.
$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 написал(а):
Ну кавычка может быть не обязательно после пустого места
Она может быть вообще в тексте - после символа,в конце строки и т.п. Это я здесь просто как пример привел... Может быть и так :
'это "про"сто ст"рока'
Главная задача - найдти неэкранированную кавычку в тексте. Т.е. чтобы preg_match сработал если хотя-бы одна кавычка в тексте была-бы неэкранирована и неважно после чего она идет! Экранированные кавычки не проблема - их может быть скольугодно много.
Она может быть вообще в тексте - после символа,в конце строки и т.п. Это я здесь просто как пример привел... Может быть и так :
'это "про"сто ст"рока'
Главная задача - найдти неэкранированную кавычку в тексте. Т.е. чтобы 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 написал(а):
Тоже не пойдет... Можно в принципе просчитать количество вхождений \" и количество вхождений ", при этом проверив не являются ли " частью \", сравнив найденные позиции, но уж больно это через одно место получается
Дело вроде плевое, толькоя сам завис с ним...
Дело вроде плевое, толькоя сам завис с ним...
Спустя 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 дня сижу мучаюсь.
Благодарю за учебник, почитаю. Тут видать на чтении обычных статей не выедешь
Спустя 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\"'; |
С кавычкой действительно справляется, а вот экранированный слэш что-то не находит, но его в принципе мне находить и не надо...
И можно поинтересоваться, а зачем такое огромное количество бэкслешей в шаблоне и что в данном случае означает |^ . Начало строки ? :)
Спустя 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
вот так вроде должно работать
вот так вроде должно работать
'#^"|[^\\\\]"#'