Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Любые символы.
 
 автор: Николай2357   (09.07.2008 в 20:37)   письмо автору
 
 

Здравствуйте.
Вопрос навернре надоевший, но поиск по сайту ничего не дал.
Как всетаки обозначить любой символ, включая пробел и перевод строки?
Спасибо.

   
 
 автор: Trianon   (09.07.2008 в 21:07)   письмо автору
 
   для: Николай2357   (09.07.2008 в 20:37)
 

ну например [\s\S]

   
 
 автор: Николай2357   (10.07.2008 в 06:41)   письмо автору
 
   для: Trianon   (09.07.2008 в 21:07)
 

Я так пробовал, чет не получается. до перевода строки работает. Пробелы видит, а перевод строки нет. Хотя должен. Может я не так что делаю. Задача такая: выбрать все, что есть между кавычками. Включая пробелы, перевод строки перевод страницы и все что угодно. Ах, да, может я не в ту тему, но мне это на JS нужно. Вот так не работает:

var reg1 = new RegExp("\"[\s\S]*\","g");
var reg1 = new RegExp("\"(.*)\","g");

Спасибо.

   
 
 автор: GeorgeIV   (10.07.2008 в 10:16)   письмо автору
 
   для: Николай2357   (10.07.2008 в 06:41)
 

а использовать \n\r не пробовал?
во вторых, если текст прочитан построчно из файла, перевода строк там может и не быть (не уверен, не проверил,но вроде так)

   
 
 автор: Николай2357   (10.07.2008 в 10:41)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 10:16)
 

Блин, где ты раньше был? Oгромное спасибо! Второй день мучаюсь.
Я \n проверял конечно, а на \n\r ума не хватило.
Все работает, спасибо еще раз.
А вообще не понятно, \s вроде бы все должен подразумевать, все пробельные символы.

   
 
 автор: GeorgeIV   (10.07.2008 в 10:46)   письмо автору
 
   для: Николай2357   (10.07.2008 в 10:41)
 

перевод строки по моему не входит ни в один набор

   
 
 автор: Николай2357   (10.07.2008 в 11:23)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 10:46)
 

У меня следующая загвоздка, как теперь ковычку из текста между ковычками исключить. Пробовал [^\"] - не получается. А так он у меня все от первой до последней ковычки тащит.

   
 
 автор: GeorgeIV   (10.07.2008 в 11:39)   письмо автору
 
   для: Николай2357   (10.07.2008 в 11:23)
 

а уверен, что именно двойная кавычка между одинарными, а не наоборот?

   
 
 автор: Николай2357   (10.07.2008 в 11:47)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 11:39)
 

Да разницы нет, какая. Вот если текст такой: Вова, "Вася", Петя, "Дима", Маша
он выдает "Вася", Петя, "Дима". То есть все, что между первой и последней.

   
 
 автор: Николай2357   (10.07.2008 в 11:34)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 10:46)
 

В умной книжке написано: \s - любой пробельный символ, включая пробел, табуляцию, перевод страницы, новая строка и перевод каретки.
Может книжка не сильно умная...

   
 
 автор: GeorgeIV   (10.07.2008 в 11:59)   письмо автору
 
   для: Николай2357   (10.07.2008 в 11:34)
 

Скорей всего книжка права... :-(

   
 
 автор: Николай2357   (10.07.2008 в 12:04)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 11:59)
 

Интересно, а почему же не работает с \s, а работает с \n\r? Я с перепугу все прописал и \f и \t и \v...
Как же всетаки исключить зту ковычку дурацкую? Опять ни один вариант из умной книжки не проходит.

   
 
 автор: Николай2357   (10.07.2008 в 12:33)   письмо автору
 
   для: Николай2357   (10.07.2008 в 12:04)
 

Методом научного тыка вычислил, что нужно сделать так:
\'(.*?)\'
Остался вопрос, что такое вопрос?(знак вопросительный) В моей умной книжке такого нет...

   
 
 автор: GeorgeIV   (10.07.2008 в 12:42)   письмо автору
 
   для: Николай2357   (10.07.2008 в 12:33)
 

Квалификаторы

Регулярное выражение можно уточнить при помощи квалификаторов - так называются символы +, ?, *. Квалификаторы говорят о том, сколько раз последовательность символов может встретиться в строке и указываются непосредственно после той части выражения, к которой они применяются:
• "a+" - хотя бы один а (строки "абв" и "абва" соответствуют этому выражению, а строка "укр" - нет);
• "a?" - ноль или один а (строки "абв" и "укр" соответствуют этому выражению, а строка "абва" - нет);
• "a*" - ноль или более а (строки "абв" и "абва" и "укр" соответствуют этому выражению).

И еще

Для решения этой проблемы нужно написать знак вопроса после квантификатора. Тогда он перестанет быть «жадным» и попытается захватить как можно меньшее число повторений элемента, к которому он применен (квантификатор применяется к элементу, что стоит перед ним).

   
 
 автор: Николай2357   (10.07.2008 в 13:53)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 12:42)
 

Огромное спасибо. Очень мне помогли. Пойду в магазин за другой книжкой, эта не полная. Про квантификаторы там есть, а про вопрос както упустили...

   
 
 автор: Trianon   (10.07.2008 в 12:46)   письмо автору
 
   для: Николай2357   (10.07.2008 в 12:33)
 

вопрос после квантификатора меняет режим жадности.

   
 
 автор: Николай2357   (10.07.2008 в 14:36)   письмо автору
 
   для: Trianon   (10.07.2008 в 12:46)
 

А как логически это понять?
* обозначает ноль или больше, а ?- 0 или 1. А когда *? все равно должно быть 0 или 1,
или + это один или больше, а +? должно тоже быть не больше одного вхождения. Однако конструкция (.*?) или (.+?) вылавливает все символы, даже если они повторяются (я проверял), а конструкция \"(.*?)\" или \"(.+?)\" вылавливает все, кроме ковычки.
Странно.

   
 
 автор: GeorgeIV   (10.07.2008 в 14:53)   письмо автору
 
   для: Николай2357   (10.07.2008 в 14:36)
 

так потому что точка - это любой символ, поэтому тут жадность не появляется.
а ? после квантификатора означает, что поиск остановится при первом же совпадении, а не будет искаться максимальное

   
 
 автор: Николай2357   (10.07.2008 в 15:08)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 14:53)
 

Все равно непонятно. Вот такой текст "ававава". По логике поиск должен остановиться на второй а.
Или если такой "авввввввва". Может так и есть, сейчас проверю.
Трудно это понять. Но уже чтото. Я первый раз с регулярными столкнулся, спасибо за ликбез.

   
 
 автор: GeorgeIV   (10.07.2008 в 15:17)   письмо автору
 
   для: Николай2357   (10.07.2008 в 15:08)
 

если точка - не остановится, если "/ав/", должен

   
 
 автор: Николай2357   (10.07.2008 в 15:50)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 15:17)
 

Да все так. А ковычка то причем тут, непойму. Вот по полочкам, как я понимаю. (Мне это очень важно понять, потому что на этом будет строится мое представление о регулярных)
\" означает, что выражение начинается с ковычки. Потом (.+?). Не совсем понятно, но примерно так: любой, в том числе и ковычка, могут встретится в тексте + один или более раз, ? может встретится только один раз или невстретиться совсем. Тоесть вместе должно быть только один раз. Потом опять \" то есть заканчивается ковычкой.
Вот тут начинается.
1.Почему не работает квантификатор {1} вместо +? \?(cлэш защитный, чтобы с тем вопросом не перепутать. Шутка)
2. Почему любые дручие символы, кроме ковычек могут встречаться в тексте больше одного раза.
3. Причеь здесь эта ковычка. Ему глубоко плевать на остальные символы. Я проверял.
Выходит, что такая конструкция (.+?) или (.*?) обозначает "все кроме ковычек". Любых. Обратные я тоже проверил.
Вот.
Нет на другие символы тоже реагирует, я ошибся. Получается, что в тексте между первым и последним символом не может встретиться того, что стоит рядом.
Пока не понимаю.
Посоветуйте что нибудь толковое почитать пожалуйста.
Спасибо.

   
 
 автор: GeorgeIV   (10.07.2008 в 16:33)   письмо автору
 
   для: Николай2357   (10.07.2008 в 15:50)
 

в гугле набираешь регулярное выражение и чиатешь все подряд. Мне самому, даже с немалой практикой, порой трудно до конца понять, как написать ту или иную регулярку., инет помогает.

   
 
 автор: Николай2357   (10.07.2008 в 16:58)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 16:33)
 

Спасибо. Я в Гугле второй день эту тему лопачу, там копирайт один (это так называется?). Времени жалко. Но все равно спасибо.

   
 
 автор: GeorgeIV   (10.07.2008 в 13:09)   письмо автору
 
   для: Николай2357   (10.07.2008 в 12:33)
 

Я только не понял, почему нельзя так
<?php
$text 
'Вова, "Вася", Петя, "Дима", Маша';
  
$str preg_replace('/"/',"",$text);
  
print_r($str);
?>
Или я не так понял?

   
 
 автор: Николай2357   (10.07.2008 в 13:55)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 13:09)
 

Текст очень длинный, и там все что угодно может встретиться. И одинарные ковычки в том числе. Нужно выдернуть именно нужные куски.
Да, и еще, это в JS мне нужно было.
Вот теперь порядок.

   
 
 автор: AcidTrash   (09.07.2008 в 22:54)   письмо автору
 
   для: Николай2357   (09.07.2008 в 20:37)
 

>Как всетаки обозначить любой символ
*

   
 
 автор: xx77   (10.07.2008 в 10:31)   письмо автору
 
   для: AcidTrash   (09.07.2008 в 22:54)
 

столкнулся с чем-то похожим ,
вот например код должен считать сколько введено символов.
но после добавления перевода строки получается что добавилось два символа
, и второй не \r

<textarea name="text" rows="3" style="width:90%; padding:8px; font: bold 105% Arial;" onkeypress="cs(this);"></textarea>
<input type="submit" value="send"/>

<div>символов: <span id="cs">0</span></div>
<script type="text/javascript">
<!--
function cs(x){
x.value = x.value.replace(/\r?\n/mg, '\n')
var c = x.value.length + 1;
document.getElementById('cs').innerHTML= c;
}
//-->
</script>

   
 
 автор: GeorgeIV   (10.07.2008 в 10:40)   письмо автору
 
   для: xx77   (10.07.2008 в 10:31)
 

в разных осях - разный конец строки, только в винде \r\n , в других используется по одному символу

   
 
 автор: xx77   (10.07.2008 в 10:53)   письмо автору
 
   для: GeorgeIV   (10.07.2008 в 10:40)
 

точно.
оказалось x.value = x.value.replace( .................. не давало результатов
просто надо считать без \r
var c = x.value.replace(/\r/g, '').length + 1;

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования