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

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

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

 

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

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

тема: использование "или" в регулярном выражении!
 
 автор: tricket   (30.05.2007 в 21:19)   письмо автору
 
 

есть переменная $perem
есть решулярное выражение которое проверяет следующее
ссылка site.ru/1=ddg&2=$perem&3=343&4=3fged
но дело в том что переменная $perem может содержаться как и под цифрой 1 так и под цифрой 2 так 3 так и 4... но она находится определённо ТОЛЬКО в одной из них...в других содержаться какие-то произвольные данные... как под это написать регулярное выражение?

   
 
 автор: Саня   (30.05.2007 в 23:23)   письмо автору
 
   для: tricket   (30.05.2007 в 21:19)
 

<?
$perem 
"blah";
$url "site.ru/1=ddg&2=$perem&3=343&4=3fged";
list(
$site$query) = explode("/"$url);
parse_str($query$arr);
foreach( 
$arr as $key => $val ) {
  if ( 
$val == $perem ) {
    print 
'$perem найдено в индексе '.$key;
  }
}

   
 
 автор: kasmanaft   (31.05.2007 в 09:17)   письмо автору
 
   для: Саня   (30.05.2007 в 23:23)
 

Низачот! :))
Во-первых, просили рег. выражение (я бы сам на него с удовольствием взглянул), во-вторых, вообще какой-то частный случай (будет >1 слешей, работать не будет), в-третьих, вообще не это просили... Как я понял нужно проверить, что $perem содержится только в одном индексе. Хотя, могу, конечно, ошибаться (хотел бы взглянуть именно на рег. выражение)

   
 
 автор: tricket   (31.05.2007 в 11:23)   письмо автору
 
   для: kasmanaft   (31.05.2007 в 09:17)
 

Саня конечно спасибо за энтузиазм, но не то.
kasmanaft да ты всё правильно понял!

   
 
 автор: kasmanaft   (31.05.2007 в 11:43)   письмо автору
 
   для: tricket   (31.05.2007 в 11:23)
 

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

А на рег. выражение я бы всё же взглянул :D

   
 
 автор: tricket   (31.05.2007 в 12:07)   письмо автору
 
   для: kasmanaft   (31.05.2007 в 11:43)
 

составить его непросто
я понимаю) а можешь хотя бы толчок дать, есть ли оператор "или" в регулярном выражении?
в принципе у мну есть решения моей задачи сделанные не через регулярку) но охото использовать всё же её) спортивный интерес так сказать :-D

   
 
 автор: Саня   (31.05.2007 в 12:56)   письмо автору
 
   для: kasmanaft   (31.05.2007 в 09:17)
 

Ну если так хочется регвырами:
<?
$perem 
"blah";
$url "site.ru/1=ddg&2=$perem&3=343&4=3fged";
preg_match_all("/\d=$perem/"$url$m);
if ( 
count($m[0]) > ) print '$perem встречается больше одного раза';


> (будет >1 слешей, работать не будет)
Поставить '2' в третий параметр функции explode() и пусть будет хоть миллион слешей...

   
 
 автор: kasmanaft   (01.06.2007 в 00:34)   письмо автору
 
   для: Саня   (31.05.2007 в 12:56)
 

Мне не этого хотелось. Мне хотелось посмотреть на регулярное выражение, с помощью которого (его одного) можно было бы решить поставленную задачу. То есть if ( preg_match ( ) ) echo 'yes/no'.

И я составил его. Скажу честно, было не просто.
Использовать его в бою, конечно, не нужно... Просто спортивный интерес.

<?php 
$perem 
"test"
$url "?1=aaa&2=bbb&3=ccc&4=$perem"
$url "?1=aaa&2=bbb&3=ccc&4=ddd"
$url "?1=$perem&2=aaa&3=ccc&4=$perem"
$url "?1=aaa&2=test&3=testt&4=testttt";  
if (
preg_match("#^\?\w+\=($perem)?+(?(1)|[^&]*)&\w+\=(?(1)(?!$perem&)[^&]*|(($perem)|(?!$perem&)[^&]*))&\w+\=(?(1)(?!$perem&)[^&]*|(?(3)(?!$perem&)[^&]*|(($perem)|(?!$perem&)[^&]*)))&\w+\=(?(1)(?!$perem$)[^&]*|(?(3)(?!$perem$)[^&]*|(?(5)(?!$perem$)[^&]*|$perem)))$#"$url))  
    echo 
'Всё верно'
else echo 
'Что-то не так'
?>

Без пол-литра правда тут не разберешьсся..

   
 
 автор: tricket   (01.06.2007 в 19:37)   письмо автору
 
   для: kasmanaft   (01.06.2007 в 00:34)
 

вау! а я не пью сейчас :) распечатаю твою регулярку и на досуге разберу!
спасиб! очень интересная регулярка!!!!

   
 
 автор: Trianon   (31.05.2007 в 12:58)   письмо автору
 
   для: kasmanaft   (31.05.2007 в 09:17)
 

>Низачот! :))
низачот аффтару вопроса.

Нету в регулярных выражениях никаких переменных (кроме результатов сопоставления)
Все переменные уровня php подставляются в шаблон еще до передачи движку.
Соответственно, рассыпается формулировка задачи.

   
 
 автор: tricket   (31.05.2007 в 15:01)   письмо автору
 
   для: Trianon   (31.05.2007 в 12:58)
 

ты прав) чтот моя задача похоже на чудеса для регулярок)
наверное сделаю так:

<?
$perem 
"test"
$url "site.ru/?1=ddg&2=$perem&3=343&4=3fged"
$good=preg_match_all("site\.ru/\?1=([a-zA-Z]{1,1000})&2=([a-zA-Z]{1,1000})&3=([a-zA-Z]{1,1000})&4=([a-zA-Z]{1,1000})"$url$res); 
$n='0';
if(
$good=="1")
{
#цикл лень писать :-D
if($res[1][0]==$perem){++$n;}
if(
$res[2][0]==$perem){++$n;}
if(
$res[3][0]==$perem){++$n;}
if(
$res[4][0]==$perem){++$n;}
}
if(
$n=='1' and $good='1'){echo "ссылка гуд!";}
?>

жаль но одними регулярками не обойтись(
P.S. код чисто на коленке для наглядности написал, поэтому там навено милион ошибок)

   
Rambler's Top100
вверх

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