2016-01-14 2 views
0

У меня есть вопрос о preg_match, если я пытаюсь принести что-то вроде этого: Орхусский эр ан на г Danmark означает Орхус город в Данииpreg_match и file_get_contents и æ ø å

preg_match("#<div id=[\"']faktaDiv[\"']>(.*?)</div>#si", $webside, $a2); 

echo $a2; 

Тогда выход будет быть:

Rhus э ен на г Danmark означает Rhus город в Дании

Как я могу это исправить? В основном это должно позволить æ ø å.

+0

@ chris85 - как это сделать? Да, файл UTF-8 – Morten

+0

#

(.*?)
#siu – Deep

ответ

0

Для подхода с регулярным выражением вам нужен модификатор u. Полный список модификаторов PHP см. В http://php.net/manual/en/reference.pcre.pattern.modifiers.php, i и s, которые вы используете в настоящее время, - это 2 других модификатора.

preg_match("#<div id=[\"']faktaDiv[\"']>(.*?)</div>#siu", $webside, $a2); 

Похоже, что вы разбираете HTML, хотя я бы использовал domdocument для разбора этой строки.

$doc = new DOMDocument(); 
$doc->loadHTML('<div id="faktaDiv">Test Stuff</div>'); 
$divs = $doc->getElementsByTagName('div'); 
foreach($divs as $div) { 
    if($div->getAttribute('id') == 'faktaDiv') { 
     echo $div->nodeValue; 
    } 
} 

Чтобы вытащить title вы должны использовать анализатор, как это.

$doc = new DOMDocument(); 
$doc->loadHTML('<title>Test Stuff</title>'); 
$title = $doc->getElementsByTagName('title')->item(0)->nodeValue; 
echo $title; 

Насколько я знаю, что должен быть только один title одна страница. Если это не так, удалите ->item(0)->nodeValue и пройдите через массив.

PHP Демо: https://eval.in/502432

+0

Модификатор u устарел и не работает. Я загружаю веб-сайт с файлом_get_contents, howdo я реализую это в вашем коде? – Morten

+0

Если я хочу получить текст между с веб-сайта, как мне это сделать с помощью file_get_content? – Morten

+0

Проблема OP не имеет ничего общего с отсутствием модификатора 'u'. Строка шаблона проста, 7-битная ASCII, и совпадение найдено просто отлично. Его проблема заключается в том, что он пытается просмотреть результат в кодировке, отличной от той, что находится в строке темы (если это UTF, или нет, мы не знаем, но 'u' не будет волшебным образом делать это, если это не так). – lafor

0

Вы можете использовать \X, чтобы соответствовать любой UTF-8 символов (например, точка используется для AnSi символов), определенную точку кода, диапазон кодовых точек или категорию Юникода:

http://www.regular-expressions.info/unicode.html

Чтобы ответить на ваш вопрос, я бы сказал, что замена (.*?)(\X*?) с достаточно.

Matching один графемы, будь то кодируются как единая точка кода, или в виде нескольких точек кода с использованием сочетающих знаков, легко в Perl, PCRE, PHP и Ruby, 2.0: просто использовать \ X. Вы можете рассматривать \ X версию Unicode точки. Однако есть одна разница: \ X всегда совпадает с символами прерывания строки, тогда как точка не соответствует символам прерывания строки, если вы не включите точку, совпадающую с режимом соответствия новой строки.