Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

PHP 5. Регулярное выражение

13
10 августа 2008 года
RussianSpy
3.0K / / 04.07.2006
Есть текст примерно такого вида:
Код:
[[vasya]]
>>>
<table width="100%" cellspacing="0" cellpadding="0" border="0">
  <tr><td height="25" colspan="2">link</td></tr>
</table>
<<<

[[international experts]]
>>>
<tr><td height="25"><a href="http://yandex.ru" class="menu_link">text</a></td></tr>
<<<

[[new_wave]]
>>>
<tr><td height="25"><b style="color:red;">click me</b></td></tr>
<<<


если обобщить, то этот код представляет собой заголовок, заключенный в скобки [[ ]] и кусок HTML кода заключенный в >>> <<<. Заголовок может содержать только буквы латиницы, пробелы и знаки подчеркивания. HTML код соответственно может содержать самые разные символы.


Задача в следующем - нужно такое регулярное выражение которое бы вытаскивало заголовки и код которым они соответствуют.

Сломал себе всю голову и клавиатуру. ))) Буду очень признателен за помощь.
1.9K
11 августа 2008 года
max_dark
256 / / 11.11.2005
Сначала дошел до регулярки /\[\[([a-z_ ]+)\]\]\s*>>>\s*(.+)\s*<<</i
но она не хотела воспринимать Васю :D
Затем добавил модификатор s и она стала проглатывать весь текст
В конце концов решил заменить [[,]],>>> и <<< численными значениями(символами с кодом, близким к нулю) и оно сработало
Код:
<?php
$code=<<<CODE
[[vasya]]
>>>
<table width="100%" cellspacing="0" cellpadding="0" border="0">
  <tr><td height="25" colspan="2">link</td></tr>
</table>
<<<

[[international experts]]
>>>
<tr><td height="25"><a href="http://yandex.ru" class="menu_link">text</a></td></tr>
<<<

[[new_wave]]
>>>
<tr><td height="25"><b style="color:red;">click me</b></td></tr>
<<<
CODE;
$code=str_replace("[[","\1",$code);
$code=str_replace("]]","\2",$code);
$code=str_replace(">>>","\3",$code);
$code=str_replace("<<<","\4",$code);
$reg1="/\1([a-z_ ]+)\2[\s]*\3([^\3\4]+)\4/si";
if (preg_match_all($reg1,$code,$match,PREG_SET_ORDER)) {
    $x=array();
    foreach($match as $val) {
        $x[][$val[1]]=$val[2];
    }
    print_r($x);
}
else {
    echo "No match\n";
}
?>
Выводит
Код:
Array
(
    [0] => Array
        (
            [vasya] =>
<table width="100%" cellspacing="0" cellpadding="0" border="0">
  <tr><td height="25" colspan="2">link</td></tr>
</table>

        )

    [1] => Array
        (
            [international experts] =>
<tr><td height="25"><a href="http://yandex.ru" class="menu_link">text</a></td></tr>

        )

    [2] => Array
        (
            [new_wave] =>
<tr><td height="25"><b style="color:red;">click me</b></td></tr>

        )

)
13
11 августа 2008 года
RussianSpy
3.0K / / 04.07.2006
Насколько такая замена вообще является корректной? Как-то без нее возможно обойтись?
1.9K
11 августа 2008 года
max_dark
256 / / 11.11.2005
Можно убрать замену [[ и ]] т.е.
 
Код:
// $code=str_replace("[[","\1",$code);
// $code=str_replace("]]","\2",$code);
$code=str_replace(">>>","\3",$code);
$code=str_replace("<<<","\4",$code);
$reg1="/\[\[([a-z_ ]+)\]\][\s]*\3([^\3\4]+)\4/si";

Данная замена корректна, если в выделяемом тексте не содержится символов с кодами \3, \4 и подстрок >>> <<<
Обойтись без замены при использовании регулярных выражений мне не представляется возможным
Замену можно не делать, если воспользоватся не регулярным выражением, а strpos, но код при этом, естественно, вырастет в несколько раз
13
11 августа 2008 года
RussianSpy
3.0K / / 04.07.2006
Спасибо :)
17K
12 августа 2008 года
HookEst
144 / / 27.03.2008
Насколько я понял, достаточно делать UNGREEDY поиск (модификатор U):
 
Код:
$re="/\[\[([a-z_ ]+)\]\]\s*>>>(.+)<<</siU";

тогда без всяких замен:
Код:
<?php
$code=<<<CODE
[[vasya]]
>>>
<table width="100%" cellspacing="0" cellpadding="0" border="0">
  <tr><td height="25" colspan="2">link</td></tr>
</table>
<<<

[[international experts]]
>>>
<tr><td height="25"><a href="http://yandex.ru" class="menu_link">text</a></td></tr>
<<<

[[new_wave]]
>>>
<tr><td height="25"><b style="color:red;">click me</b></td></tr>
<<<
CODE;
$re="/\[\[([a-z_ ]+)\]\]\s*>>>(.+)<<</siU";

if (preg_match_all($re,$code,$match,PREG_SET_ORDER)) {
    $x=array();
    foreach($match as $val) {
        $x[][$val[1]]=$val[2];
    }
    echo "<pre>CODE:\n".htmlspecialchars($code)."<hr>";

    echo htmlspecialchars(print_r($x, 1))."</pre>";
}
else {
    echo "No match\n";
}
?>


выводит:
Код:
...
Array
(
    [0] => Array
        (
            [vasya] =>
<table width="100%" cellspacing="0" cellpadding="0" border="0">
  <tr><td height="25" colspan="2">link</td></tr>
</table>

        )

    [1] => Array
        (
            [international experts] =>
<tr><td height="25"><a href="http://yandex.ru" class="menu_link">text</a></td></tr>

        )

    [2] => Array
        (
            [new_wave] =>
<tr><td height="25"><b style="color:red;">click me</b></td></tr>

        )

)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог