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

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

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

 

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

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

тема: Знакомство с preg_replace
 
 автор: Владимир55   (27.03.2009 в 14:34)   письмо автору
 
 

Хочу понять суть работы preg_replace, но ни Самоучитель рнр, ни Практика создания сайтов не внесли ясности.

Для пробы написал 4 варианта:
    $text = 'http://nova.rambler.ru/search?set=www&words=Человек&btnG=Найти!';
    echo preg_replace("Найти!", "", $text);    // 1. Хотел убрать Найти! - не работает. Почему?
    echo preg_replace("|Найти!|", "", $text);  // 2. Хотел убрать Найти! - работает 
    echo preg_replace("[a-Z]", "", $text);     // 3. Хотел убрать все буквы латиницы. Исчезли лишь некоторые. Получилось set=www&words=Человек&btnG=Найти!
    echo preg_replace("|http|nova|", "", $text); // 4. Хотел убрать http и nova - не работает вообще. Почему?
Можете объяснить, почему так?

  Ответить  
 
 автор: nikita2206   (27.03.2009 в 15:23)   письмо автору
 
   для: Владимир55   (27.03.2009 в 14:34)
 

у preg есть отличия от ereg и одно из этих отличий заключается в том, что в preg вы должны ваше выражение "округлять" в два любых одинаковых символа, тоесть: "|Найти!|", здесь вы округлили в |
чтобы сработало такое выражение: "|http|nova|", легче всего использовать другой знак, вместо |, тоесть так: "/http|nova/"

  Ответить  
 
 автор: Владимир55   (27.03.2009 в 15:43)   письмо автору
 
   для: nikita2206   (27.03.2009 в 15:23)
 

Это получилось, спасибо!

А почему не работает
echo "<br>3 ", preg_replace("[а-Я]", "", $text);
echo "<br>4 ", preg_replace("[a-Z]", "", $text);

Текст остается неизменным!

  Ответить  
 
 автор: nikita2206   (27.03.2009 в 15:45)   письмо автору
 
   для: Владимир55   (27.03.2009 в 15:43)
 

вы округлить забыли;)
"|[а-Я]|"

  Ответить  
 
 автор: Владимир55   (27.03.2009 в 15:55)   письмо автору
 
   для: nikita2206   (27.03.2009 в 15:45)
 

Не забыл, а с округлением работать не хочет!

Вот так
echo "<br>4 ", preg_replace("|[a-Z]|", "", $text);
или вот так
echo "<br>4 ", preg_replace("/[a-Z]/", "", $text);

получаю сообщение:
Warning: preg_replace() [function.preg-replace]: Compilation failed: range out of order in character class at offset 


Что неверно?

  Ответить  
 
 автор: nikita2206   (27.03.2009 в 16:04)   письмо автору
 
   для: Владимир55   (27.03.2009 в 15:55)
 

нельзя ставить от маленькой a до большой Z....
суть в том, что символы в таблице ASCII расположены так, что с 65 по 90 идут символы крупного регистра, а с 97 по 122 нижнего регистра, поэтому если вы хотите заменить все буквы невзирая на регистр, то надо писать не |a-Z|, а |A-z|....

  Ответить  
 
 автор: Владимир55   (27.03.2009 в 16:13)   письмо автору
 
   для: nikita2206   (27.03.2009 в 16:04)
 

Похоже, что в книжке допущена некорректность.
Большое Вам спасибо!

  Ответить  
 
 автор: Владимир55   (27.03.2009 в 16:32)   письмо автору
 
   для: Владимир55   (27.03.2009 в 16:13)
 

Есть какая-то специфика использования в образце знака вопроса?
Если требуется удалить вопросительный знак, то как это делается?

  Ответить  
 
 автор: nikita2206   (27.03.2009 в 16:46)   письмо автору
 
   для: Владимир55   (27.03.2009 в 16:32)
 

ДА
(.?) - этот шаблон соответствует любому, одному, символу или ничему, тоесть ноль или одно вхождение...
пример:
$var1 = 'ABCabc';
$var2 = 123;
preg_match('/[A-z]?/', $var1); //Возвратит TRUE
preg_match('/[A-z]?/', $var2); //Возвратит тоже TRUE, т.к. ? - это одно или ноль вхождений...

(.+) - этот шаблон соответствует любому символу, в количестве от 1-го до бесконечности, тоесть 1 или более вхождений....
пример:
$var1 = 'ABCabc';
$var2 = 123;
preg_match('/[A-z]+/', $var1); // Возвратит TRUE
preg_match('/[A-z]+/', $var2); // Возвратит FALSE, т.к. в этой переменной меньше одной буквы

(.*) - этот шаблон будет соответствовать от 0 до бесконечности, то есть он включает в себя и + и ?

также ? используют для задания жадности(greedy) выражения....

  Ответить  
 
 автор: Владимир55   (27.03.2009 в 17:04)   письмо автору
 
   для: nikita2206   (27.03.2009 в 16:46)
 

Видимо, для удаления ? лучше использовать строковую функцию. Так?

  Ответить  
 
 автор: nikita2206   (27.03.2009 в 17:07)   письмо автору
 
   для: Владимир55   (27.03.2009 в 17:04)
 

отвечу кратко:
<?
$var 
'Видимо, для удаления ? лучше использовать строковую функцию. Так?';
$var preg_replace('|\?|'NULL$var); // но намного быстрее будет использовоние str_replace

  Ответить  
 
 автор: Владимир55   (27.03.2009 в 17:55)   письмо автору
 
   для: nikita2206   (27.03.2009 в 17:07)
 

ОК!

  Ответить  
 
 автор: ddhvvn   (27.03.2009 в 18:42)   письмо автору
 
   для: nikita2206   (27.03.2009 в 15:45)
 

Да с этим "округлением" Вы, конечно, постарались - еще то извращение =)

  Ответить  
 
 автор: Владимир55   (27.03.2009 в 19:07)   письмо автору
 
   для: ddhvvn   (27.03.2009 в 18:42)
 

Не могли бы Вы пояснить, что именно является "извращением" и как делается более корректно?

  Ответить  
 
 автор: ddhvvn   (27.03.2009 в 19:29)   письмо автору
 
   для: Владимир55   (27.03.2009 в 19:07)
 

да нет =))
я про само "название", выданное Никитой )
Было бы лучше сказать "ограничение".
Вот эти "символы, стоящие по краям" задают границы регулярного выражения.

  Ответить  
 
 автор: Keyses   (13.06.2009 в 19:36)   письмо автору
 
   для: Владимир55   (27.03.2009 в 14:34)
 

Подскажите как составить выражение для преобразования 1:13 => 01:13

Делал так, но не работает:

<?php
preg_replace
('/^(\d{1})[:]([1-5]{1})(\d{1})/''0\\1'$_POST['time_in_h'])
?>

  Ответить  
 
 автор: vadimka   (13.06.2009 в 23:21)   письмо автору
 
   для: Keyses   (13.06.2009 в 19:36)
 

как запасной вариант(изврат, конечно)

<?
$_POST
['time_in_h']="1:13";
(
ereg ("([0-9]):([0-9]{1,2})"$_POST['time_in_h'], $regs));
$a=sprintf("%02d"$regs[1]);
echo 
$a.":".$regs[2];
?>

но, в первом приближении работает:)

  Ответить  
 
 автор: Keyses   (14.06.2009 в 08:50)   письмо автору
 
   для: vadimka   (13.06.2009 в 23:21)
 

Немного не то, регулярка составлена не верно для минут, там обязательно должен быть ведущий нуль. или же его тоже требуется подствлять.
А просто preg_replace() тут никак не обойтись разве?

  Ответить  
 
 автор: vadimka   (17.06.2009 в 11:58)   письмо автору
 
   для: Keyses   (14.06.2009 в 08:50)
 

убитая тема, надо делать новую, а так?

$_POST['time_in_h']='1:13';
$f=preg_replace("|(^[0-9])(:)([0-9]{2})$|e", "sprintf('%02d', $1).'$2$3'", $_POST['time_in_h']);
echo $f;

  Ответить  
 
 автор: AcidTrash(кафе)   (17.06.2009 в 13:26)
 
   для: Keyses   (13.06.2009 в 19:36)
 

preg_replace('/^(\d{1}:)([1-5]{1,2})/', '0\\1\\2', $_POST['time_in_h'])

  Ответить  
Rambler's Top100
вверх

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