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

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

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

 

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

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

тема: блок php кода в тексте
 
 автор: Alph[p]a   (24.08.2007 в 15:51)   письмо автору
 
 

Подскажите как найти в тексте все блоки состоящие из

<?php
...
?>

с помощью регулярного выражения,
пробовал

$pattern='|<?php(.*)?>|is';
preg_match($pattern,$string,$s);

чёт выдает не то что надо...помогите.

   
 
 автор: ddhvvn   (24.08.2007 в 16:00)   письмо автору
 
   для: Alph[p]a   (24.08.2007 в 15:51)
 

Знак вопроса нужно экранировать: /?

   
 
 автор: kasmanaft   (24.08.2007 в 16:01)   письмо автору
 
   для: Alph[p]a   (24.08.2007 в 15:51)
 

Нужно экранировать вопросы. И жадность поменять.
|<\?php(.*?)\?>|is

   
 
 автор: Alph[p]a   (24.08.2007 в 16:12)   письмо автору
 
   для: kasmanaft   (24.08.2007 в 16:01)
 


<?php
$text
="
Тут php код:
<?php
# комментарий к первой части
echo 'Вот это будет напечатано';
# комментарий
echo '---';
?>
Далее идет просто текст..
а затем снова код
<?php
# еще комментарий
echo 'вот это да!';
# комментарий ко второй части
?>
ну и конец"
;
$text=htmlspecialchars($text);
$pattern='|<\?php(.*?)\?>|is';
preg_match($pattern,$text,$s);
echo 
'<pre>';
print_r($s);
echo 
'</pre>';
?>

результат

Array
(
)

(

   
 
 автор: Faraon   (24.08.2007 в 16:50)   письмо автору
 
   для: Alph[p]a   (24.08.2007 в 16:12)
 


<pre>
<?php

$string
="Тут php код:
<?php
# комментарий к первой части
echo 'Вот это будет напечатано';
# комментарий
echo '---';
?>
Далее идет просто текст..
а затем снова код
<?php
# еще комментарий
echo 'вот это да!';
# комментарий ко второй части
?>
ну и конец"
;

preg_match_all("/<\?php([^\?>]*)\?>/is",$string,$s);
print_r ($s);

?>

   
 
 автор: kasmanaft   (24.08.2007 в 16:52)   письмо автору
 
   для: Alph[p]a   (24.08.2007 в 16:12)
 

1. Зачем htmlspecialchars() ? В таком случае в тексте нужно искать не "<?php", а "&lt;?php".. ну и т.д.
2. Нужно использовать preg_match_all, а из регекспа убрать круглые скобки..

2Faraon
[^\?>] - означает не именно "?>", а "не ? или не >"

   
 
 автор: Alph[p]a   (24.08.2007 в 17:24)   письмо автору
 
   для: kasmanaft   (24.08.2007 в 16:52)
 

совсем забыл про htmlspecialcahrs()...
а вообще спасибо... воспользуюсь случаем задам ещ0 вопрос ,

<pre> 
<?php 

$string
="Тут php код: 
<?php 
# комментарий к первой части 
echo 'Вот это будет напечатано'; 
# комментарий 
echo '---'; 
?> 
Далее идет просто текст.. 
а затем снова код 
<?php 
# еще комментарий 
echo 'вот это да!'; 
# комментарий ко второй части 
?> 
ну и конец"


preg_match_all("/<\?php([^\?>]*)\?>/is",$string,$s); 
for (
$i=0;$i<sizeof($s);$i++)
{

    
$result.=highlight_string('<?php'.$s[1][$i].'?>',true);

}
echo 
$result;
?>
</pre>

все прекрасно подсвечивается но как вывести весь текст (вместе с кодом) а не только код...помогите......

   
 
 автор: kasmanaft   (24.08.2007 в 18:10)   письмо автору
 
   для: Alph[p]a   (24.08.2007 в 17:24)
 

Наверное "echo preg_replace("/<\?php.*?\?>/ise", "highlight_string('\\0', 1);", $string);"

PS вот это "/<\?php([^\?>]*)\?>/is" лучше не использовать.

   
 
 автор: Alph[p]a   (24.08.2007 в 22:56)   письмо автору
 
   для: kasmanaft   (24.08.2007 в 18:10)
 

спасибо,
а чего тогда я парался ...очередной раз подтверждается истина - все гениальное и просто... и напрашивается вывод - учите регулярные выражения .

   
 
 автор: Alph[p]a   (25.08.2007 в 15:08)   письмо автору
 
   для: Alph[p]a   (24.08.2007 в 22:56)
 

не буду плодить темы.....но опять прошу помощи...
дело обстоит так...например добавляю в базу вот такой текст

Тест тест тест тест тест тест тест тест тест тест тест тест тест
<?php
function post_work_up($postbody)
{
    
// Обрабатываем теги [code], 

$text = "
";
    $lastocc = 0;
    $sndocc = 1;
    $result = "";
    while($sndocc)
    {
      $fstocc = strpos($postbody,"[code]",$lastocc);
      $sndocc = strpos($postbody,"
",$fstocc);
if(($fstocc>0 && $sndocc>0 && $lastocc>0) || ($fstocc >= 0 && $sndocc>0 && $lastocc == 0))
{
$result .= nl2br(htmlspecialchars(substr($postbody,$lastocc,$fstocc - $lastocc)));
$result .= "<table border=0 ><tr><td class=codeblock>".highlight_string(substr($postbody,$fstocc + 6,$sndocc - $fstocc - 6),true)."</td></tr></table>";
$lastocc = $sndocc + 7;
}
else
{
$result .= nl2br(htmlspecialchars(substr($postbody,$lastocc,strlen($postbody)-$lastocc)));
break;
}
}
$postbody = $result;
$postbody = str_replace("","<b>",$postbody);
$postbody = str_replace("
","</b>",$postbody);
$postbody = str_replace("","<i>",$postbody);
$postbody = str_replace("
","</i>",$postbody);
$postbody = str_replace("`","'",$postbody);
return $postbody;
}
?>
Тест тест тест тест тест тест тест тест тест тест тест тест тест
[/code]
вывожу так вот кусок кода:

                $pars=$art['article'];
$pars=preg_replace("/<\?php.*?\?>/ise", "highlight_string('\\0', 1);", $pars);
                $pars=str_replace('&lt;?php','<div class=code>&lt;?php',$pars);
                $pars=str_replace('?&gt;','?&gt;</div>',$pars);
            
                echo nl2br($pars);

всё нормально если код простой, но в нашем случае в вывод получаю это

Тест тест тест тест тест тест тест тест тест тест тест тест тест

<?php

function post_work_up($postbody)

{

    
// Обрабатываем теги [code], 


$text =

Warning: Unexpected character in input: '\' (ASCII=92) state=1 in F:\web\apache\Apache2\htdocs\pm\library\library.php(149) : regexp code on line 33

"
\";

    $lastocc = 0;

    $sndocc = 1;

    $result = \"\";

    while($sndocc)
.........................

вопрос:
что это

Warning: Unexpected character in input: '\' (ASCII=92) state=1 in 

и как избежать этого?

p.s и если например в коде будут присутствовть ещо php теги то тоже будут проблемы, вообще не понимаю....(

   
 
 автор: Alph[p]a   (26.08.2007 в 09:58)   письмо автору
 
   для: Alph[p]a   (25.08.2007 в 15:08)
 

^

   
 
 автор: Unkind   (26.08.2007 в 11:35)   письмо автору
 
   для: Alph[p]a   (26.08.2007 в 09:58)
 

Интересный у Вас код - $result = \"\";

   
 
 автор: Alph[p]a   (26.08.2007 в 12:32)   письмо автору
 
   для: Unkind   (26.08.2007 в 11:35)
 

а это не мой код.....это кусок кода из этого форума...)
ну так что сделать чтоб

Warning: Unexpected character in input: '\' (ASCII=92) state=1 in

небыло...

   
 
 автор: Unkind   (26.08.2007 в 13:09)   письмо автору
 
   для: Alph[p]a   (26.08.2007 в 12:32)
 

C бекслешами код и был, значит?

   
 
 автор: Alph[p]a   (26.08.2007 в 13:32)   письмо автору
 
   для: Unkind   (26.08.2007 в 13:09)
 

Вот код ошибки

Warning: Unexpected character in input: '\' (ASCII=92) state=1 in F:\web\xxx\library.php(149) : regexp code on line 33

на 149 строке

$pars=preg_replace("/<\?php.*?\?>/ise", "highlight_string('\\0', 1);", $pars);

мож тут что с кавычками?

   
 
 автор: Alph[p]a   (26.08.2007 в 15:09)   письмо автору
 
   для: Alph[p]a   (26.08.2007 в 13:32)
 

ну посмотрите

<?php
$text
='
<?php
 $text = "[code]";
?>
'
;

$text=preg_replace("/<\?php.*?\?>/ise""highlight_string('\\0', 1);"$text);
echo 
$text;

?>

результат

<?php
$text =
Warning: Unexpected character in input: '\' (ASCII=92) state=1 in F:\web\apache\Apache2\htdocs\001002.php(8) : regexp code on line 3
"[code]\";
?>
ну незнаю что и делать(((

   
 
 автор: Unkind   (26.08.2007 в 15:59)   письмо автору
 
   для: Alph[p]a   (26.08.2007 в 15:09)
 

Действительно. Что за ерунда.

<?php
header
("Content-type: text/plain; charset=utf-8");
var_dump(preg_replace('/.*/se'"'\\0'"'String with "double quotes"'));
?>


P.S. Ваш код у меня выводит все нормально, за исключением двойной кавычки, которую почему-то обработчик RegEx эскейпирует.

   
 
 автор: Alph[p]a   (26.08.2007 в 16:49)   письмо автору
 
   для: Unkind   (26.08.2007 в 15:59)
 

что-ж делать-то тогда? ЛЮДИ ПОМОГИТЕ! плиз...........

   
 
 автор: kasmanaft   (26.08.2007 в 18:46)   письмо автору
 
   для: Unkind   (26.08.2007 в 15:59)
 

Кстати, да. Когда-то с этим сталкивался, да забыл.
Если вот так сделать, то будет без бэкслешей:

preg_replace('/.*/se', '"\\0"', 'String with "double quotes"')

Кавычки/апострофы местами поменяли.
Наверное, и там нужно сделать 'highlight_string("\\0", 1);'

PS а "Warning: Unexpected character in input" у меня тоже не наблюдается.


UPD Интересно. Так вообще ерунда какая-то выводится. Какбудто highlight_string() вызывается без второго аргумента. Видимо придется использовать preg_replace_callback
function func($regs) {
    return highlight_string($regs[0], 1);
}

$text=preg_replace_callback("/<\?php.*?\?>/is", "func", $text);

   
 
 автор: Alph[p]a   (26.08.2007 в 23:50)   письмо автору
 
   для: kasmanaft   (26.08.2007 в 18:46)
 

ваУ !...... работатает) спасибо....блин и как только люди додумываються до токого)))
p.s странно пишу все это дело Zend Development Environment но там "func" не подсвечивается...как будто как строка......блин как задолбали все эти кавычки, и экранирование.....kasmanaft большое спасибо.

   
Rambler's Top100
вверх

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