2014-09-06 2 views
0

Я столкнулся с очень странной ошибкой с регулярным выражением в php. Мой Паттерн /\[B\]\[SIZE=3\](Trama|Recensione:|Curiosità|Trama:)\[\/SIZE\]\[\/B\](.*?)\[B\]\[SIZE=3\]/isPHP регулярное выражение не работает

И он работает с "Trama", "Recensione:", и "Trama:", но не с "Curiosità" в моем сценарии. Странно, что если я наберу этот шаблон here, он будет соответствовать всем правильно. Что я делаю не так?

Мой сценарий:

$query = $db->query("SELECT `t`.`threadid`, `t`.`title`, `t`.`firstpostid`, `t`.`dateline`, `f`.`parentid` FROM {$db->tabelle['topic']} AS t, {$db->tabelle['forum']} AS f WHERE `f`.`forumid` = `t`.`forumid` AND `f`.`parentid` = ". (SEZIONE_RECENSIONI) ." AND `visible` = 1 ORDER BY `dateline` DESC LIMIT 10"); 
     while($thread = $db->fetch_array($query)) 
     { 
      $post = $db->fetch_array($db->query("SELECT `pagetext`, `userid` FROM {$db->tabelle['post']} WHERE `postid` = {$thread['firstpostid']}")); 

      $pattern = "/\[cover\](.*?)\[\/cover\]/is"; 
      preg_match($pattern, $post['pagetext'], $cover); 

      $pattern = '/\[B\]\[SIZE=3\](Trama|Recensione:|Curiosità|Trama:)\[\/SIZE\]\[\/B\](.*?)\[B\]\[SIZE=3\]/isU'; 
      preg_match($pattern, $post['pagetext'], $trama); 
      $content = remove_bbcode($parser->parse(truncate(utf8_encode($trama[2]), 350, '...', false, true))); 
      $page .= "<li> 
      <div class=\"recensione\" style=\"background: url(".$cover[1].") no-repeat; background-size: cover; background-position: 20% center; \"> 
       <p class=\"recensione_titolo\"><a href=\"?rec={$thread['threadid']}\">{$thread['title']}</a></p> 
       <p class=\"recensione_content\">{$content} <a href=\"?rec={$thread['threadid']}\"><em>Continua a leggere</em></a></p> 
      </div> 
     </li>"; 
     } 
+1

опубликовать ваш сценарий .. –

+0

Попробуйте добавить '/ U 'flag, чтобы сделать это'/isU' – anubhava

+0

@AvinashRaj Добавлено .. – DavideR

ответ

2

Это может быть проблемой UTF8, вы можете попытаться сообщить движок регулярных выражений, что целевая строка должна быть прочитана как строка utff8. Для этого вы можете добавить (*UTF8) в начале или вы можете использовать u модификатор:

$pattern = '~(*UTF8)\[B]\[SIZE=3](Trama:?|Recensione:|Curiosità)\[/SIZE]\[/B](.*?)\[B]\[SIZE=3]~s'; 

или

$pattern = '~\[B]\[SIZE=3](Trama:?|Recensione:|Curiosità)\[/SIZE]\[/B](.*?)\[B]\[SIZE=3]~su'; 

Примечание: чтобы избежать много обратных косых черт в своем выражении, чтобы сделать его более удобным для чтения :

  • вы можете изменить шаблон разделителя, (нет необходимости бежать не режет)
  • литой закрывающий кронштейн не нужно экранировать.
  • вы можете использовать \ Q и \ E процитировать буквальную подстроку
  • вы можете использовать режим freespacing х

пример:

$pattern = '~ 
    \Q[B][SIZE=3]\E 
    (Trama:?|Recensione:|Curiosità) 
    \Q[/SIZE][/B]\E (.*?) \Q[/SIZE][/B]\E ~xus'; 
+0

Хорошо, это проблема UTF8, но если я использую модификатор 'u', он полностью перестает работать. – DavideR

+0

@DavideR: попытайтесь определить, что такое кодировка исходного текста, и преобразуйте его в utf8. (в частности, взгляните на кодировку по умолчанию в редакторе кода) –

+0

Хорошо, я собираюсь заменить à, è, ì и любой другой специальный символ с a, e, i и т. д. Спасибо вам за ваши предложения. – DavideR

Смежные вопросы