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

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

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

 

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

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

тема: preg_match, замена [a]..[/a] на код из файла ..
 
 автор: Tinni   (02.02.2011 в 02:26)   письмо автору
 
 

Здравствуйте.

Необходимо в тексте распознать комбинацию [tab]nameTab[/tab].
Где nameTab - может быть произвольным (лат.симв и цифры).
nameTab является названием таблицы и именем файла в котором она хранится.


preg_match("/^[\s\w\d]*[^\s]?[tab]{3}[^\s]?([a-zA-Z0-9]+)[^\s]+[tab]{3}[^\s]?[\s\w\d]*$/",$text, $matches);


скорее всего что-то неправильно с условием поиска. Пробовал несколько таблиц подряд, без текста:

[tab]tab[/tab][tab]tab1[/tab][tab]tab2[/tab]

в $matches всего 2 значения


$matches[0] == //сама строка (текст); 
$matches[1] == 'tab';


остальные таблицы не видит...

хорошо было всех их как-то опознать по условию и запихнуть в массив, чтобы было похоже на:


Array
(
tab => "html код из файла tab",
tab1 => "html код из файла tab1",
tab2 => "html код из файла tab2"
);

  Ответить  
 
 автор: cheops   (02.02.2011 в 10:59)   письмо автору
 
   для: Tinni   (02.02.2011 в 02:26)
 

У вас в регулярном выражении указано два раза [tab] и ни одного раза [/tab], кроме того квадратные кавычки являются спец-символом, если нужен символ квадратных кавычек их в регулярном выражении следует экранировать
\[tab\]
\[\/tab\]

  Ответить  
 
 автор: Tinni   (02.02.2011 в 17:25)   письмо автору
 
   для: cheops   (02.02.2011 в 10:59)
 

Последовал Вашему совету, получилось:


preg_match("/[\[tab\]]{5}([a-zA-Z0-9]+)[\[\/tab\]]{6}/"


Но в тексте по прежнему находит только одну таблицу.
В чем моя ошибка, подскажите пожалуйста.

  Ответить  
 
 автор: cheops   (02.02.2011 в 17:37)   письмо автору
 
   для: Tinni   (02.02.2011 в 17:25)
 

Хм... вообще-то функция preg_match() как раз и предназначена для поиска одного соответствия, если нужно найти несколько соответствий, то используется фукнция preg_match_all().
>preg_match("/[\[tab\]]{5}([a-zA-Z0-9]+)[\[\/tab\]]{6}/"
Напрасно, кстати, помещаете регулярное выражение в квадратные скобки, так как они всегда обозначают один символ. В вашем случае получается, что регулярное выражение не может найти подстроку длиной длинее или короче 6 символов. Уберите вообще фигурные скобки и неэкранированные квадратные (оставив только [a-zA-Z0-9]+), а для поиска всех соответствий используйте preg_match_all().

  Ответить  
 
 автор: Tinni   (02.02.2011 в 19:00)   письмо автору
 
   для: cheops   (02.02.2011 в 17:37)
 

Уважаемый cheops, так задача же стоит найти текст именно между этой конструкцией:
[tab]NameTab1[/tab]

для поиска [tab], где [ -1й, t -2й, a -3й, b - 4й, ] - 5й символ:
 [\[tab\]]{5} 

именно поэтому использовал такую запись,
перечисляя все возможные символы (лат.симв., цифры и [ ])

А фигурные скобки {5} (я полагал, что обозначают минимальное кол-во подряд идущих символов удовлетворяющих условию) ... Хотя тут сомневаюсь в своей правоте, т.к. обычный текст скажем: abc23 - тоже ведь удовлетворяет условию поиска.

Что-то я запутался, если честно. Но спасибо за подсказку, обязательно попробую с preg_match_all()!

ps: если не затруднит, то все же как бы Вы решили данный вопрос (описанный выше)?

  Ответить  
 
 автор: cheops   (02.02.2011 в 19:10)   письмо автору
 
   для: Tinni   (02.02.2011 в 19:00)
 

>ps: если не затруднит, то все же как бы Вы решили данный вопрос (описанный выше)?
Если я правильно понял, то что требуется, то как-то так
<?php 
  $text 
'скорее всего что-то неправильно с условием поиска.
Пробовал несколько таблиц подряд, без текста:
[tab]tab[/tab][tab]tab1[/tab][tab]tab2[/tab]
в $matches всего 2 значения'

  
$pattern "|\[tab\](.*?)\[/tab\]|is"
  
preg_match_all($pattern$text$out);
  unset(
$out[0]);
  echo 
"<pre>";
  
print_r($out[1]);
  echo 
"</pre>";
?>

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

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