[[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>
<<<
PHP 5. Регулярное выражение
Код:
если обобщить, то этот код представляет собой заголовок, заключенный в скобки [[ ]] и кусок HTML кода заключенный в >>> <<<. Заголовок может содержать только буквы латиницы, пробелы и знаки подчеркивания. HTML код соответственно может содержать самые разные символы.
Задача в следующем - нужно такое регулярное выражение которое бы вытаскивало заголовки и код которым они соответствуют.
Сломал себе всю голову и клавиатуру. ))) Буду очень признателен за помощь.
но она не хотела воспринимать Васю :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";
}
?>
$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>
)
)
(
[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>
)
)
Насколько такая замена вообще является корректной? Как-то без нее возможно обойтись?
Код:
// $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";
// $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, но код при этом, естественно, вырастет в несколько раз
Спасибо :)
Код:
$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";
}
?>
$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>
)
)
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>
)
)