2014-02-03 3 views
2

я не знаю, как фиксирует эту ошибкуизменить eregi PHP для preg_match

Warning: preg_match(): Unknown modifier '[' in 

мой код

while(list($k,$v)=each($con2)) { 
    $patt="($this->block_start_word|$this->block_end_word)[[:blank:]]*([0-9a-zA-Z\_]+)[[:blank:]]*$this->block_end_delim(.*)"; 
    if (eregi($patt,$v,$res)) { 

Я хочу обновить версию PHP из eregi в preg_match и я Tru этого

while(list($k,$v)=each($con2)) { 
    $patt="($this->block_start_word|$this->block_end_word)[[:blank:]]*([0-9a-zA-Z\_]+)[[:blank:]]*$this->block_end_delim(.*)"; 
    if (preg_match($patt,$v,$res)) { 
+0

быть осторожным с операторами сравнения, потратить некоторое время на изучение разницы между =, == и === –

ответ

1

Как вы можете видеть в этом ответе preg_match обрабатывает первый символ как разделитель How to change PHP's eregi to preg_match

частности, вы получите сообщение об ошибке, поскольку preg_match использует '(' в качестве разделителя и, таким образом, завершает картину после того, как ($ this-> block_start_word | $ this-> block_end_word) и ошибки на '['

Изменение pattern: $ patt = "/ ($ this-> block_start_word | $ this-> block_end_word) [[: blank:]] ([0-9a-zA-Z_] +) [[: blank:]] $ this-> block_end_delim/"(*.);

И он должен работать, Goodluck!

0

Хорошо, давайте идти по этому регулярному выражению:

"($this->block_start_word|$this->block_end_word)[[:blank:]]*([0-9a-zA-Z\_]+)[[:blank:]]*$this->block_end_delim(.*)"

Я предполагаю, что Вы хотите:

  • либо строковой $this->block_start_word или $this->block_end_word
  • следует 0 или более blankspace символов
  • , за которым следует 1 или более буквенно-цифровых символов
  • следует 0 или более blankspaces
  • не следуют символьной строки $this->block_end_delim
  • до конца строки

это в виду, как насчет

<?php 
$handle = fopen('php://stdin', "r"); 
while (($line = fgets($handle, 4096)) !== false) { 
     $exp = '/'; 
     $exp .= '('; 
     $exp .= '\$this\-\>block_start_word'; 
     $exp .= '|'; 
     $exp .= '\$this\-\>block_end_word'; 
     $exp .= ')'; 
     $exp .= '\s*'; // Like [[:blank:]]* 
     $exp .= '([0-9a-zA-Z\_]+)'; 
     $exp .= '\s*'; // Like [[:blank:]]* 
     $exp .= '\$this\-\>block_end_delim'; 
     $exp .= '(.*)/'; 
     if(preg_match($exp,$line)) { 
       print $line; 
     } 
} 
?> 

Если $this->block_start_word, $this->block_end_word, и $this->block_end_delim установлены в другом месте в скрипте PHP:

<?php 
$handle = fopen('php://stdin', "r"); 
while (($line = fgets($handle, 4096)) !== false) { 
     $exp = '/'; 
     $exp .= '('; 
     $exp .= '$this->block_start_word; 
     $exp .= '|'; 
     $exp .= '$this->block_end_word; 
     $exp .= ')'; 
     $exp .= '\s*'; // Like [[:blank:]]* 
     $exp .= '([0-9a-zA-Z\_]+)'; 
     $exp .= '\s*'; // Like [[:blank:]]* 
     $exp .= $this->block_end_delim; 
     $exp .= '(.*)/'; 
     if(preg_match($exp,$line)) { 
       print $line; 
     } 
} 
?> 
0

С preg_match вы должны определить разделители, и вы бы лучше включать preg_quote, а также:

$patt="/(".preg_quote($this->block_start_word)."|".preg_quote($this->block_end_word."))[[:blank:]]*([0-9a-zA-Z\_]+)[[:blank:]]*".preg_quote($this->block_end_delim)."(.*)/"; 
Смежные вопросы