Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Регулярные выражения


Автор: NZero 23.10.2014, 15:11
Написал небольшой код для вытягивания данных из 
Код

<meta name="keywords" content="засор, канализация, устранение засоров, прочистка канализации, разморозка труб" />


мой код

Код

<?php
$file=file('home.php');
foreach($file as $line):
    if(stristr($line, "keywords"))
    {
          $string=str_replace('"','',$line); //Убираю все кавычки
    }
endforeach;
$str=trim($string);//Убираю пробелы вначале и вконце строки
$reg="/content=/(.*)\\s/i";//регулярное выражение
print(preg_match($reg, $str));//выполняю регулярное выражение
?>


После выполнения кода должно получиться
засор, канализация, устранение засоров, прочистка канализации, разморозка труб
но получаю
Код

Warning: preg_match() [function.preg-match]: Unknown modifier '(' in Z:\home\localhost\www\zacora.net\file.php  on line 16

Кстати нашел отличный сайт для генерации регулярных выражений http://regex101.com

Автор: igorold 23.10.2014, 15:44
может так:

Код

$reg="/content=(.*)\\/i";


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Regulyarnyye-vyrazheniya-id5448f095ae2015133f8b4567#findElement_E7045_5448f833ae20154c438b4574_0

Автор: NZero 23.10.2014, 15:49
Цитата(igorold @ 23.10.2014,  15:44)
может так:

Код

$reg="/content=(.*)\\/i";

Так выдает другую ошибку! вот так более менее работает
Код

$reg="/content=\/(.*)\\s/i";

но выводится 0. Как же выводить то что мне нужно?

Автор: s0lman 23.10.2014, 16:09
Гоните. 
Идем читать мануал http://php.net/manual/en/function.preg-match.php
Цитата

Searches subject for a match to the regular expression given in pattern.

Цитата

preg_match() returns 1 if the pattern matches given subject, 0 if it does not, or FALSE if an error occurred.

Чтоб получить вхождения, есть третий параметр $matches.

Зачем выполнять телодвижения с заменой символов, если задача получить подстроку по регулярке? В данном случае этим только усложняется составление регулярки.

В простейшем исполнении задача решается примерно так
Код

preg_match('/content="(.*)"/i', $str, $matches);
print_r($matches[1])

где $str - исходная строка (с кавычками, пробелами и т.д.)



Автор: baldina 23.10.2014, 16:09
Цитата(NZero @  23.10.2014,  15:11 Найти цитируемый пост)
"/content=/(.*)\\s/i"

слэш лишний
Код

'/content=(.*)\s/i'


и чего эта строка должна делать?
Цитата(NZero @  23.10.2014,  15:11 Найти цитируемый пост)
preg_match($reg, $str)


я бы сделал типа
Код

foreach(file('home.php') as $line)
    if(preg_match('/keywords[^>]+content="([^"]*)"/', $line, $matches)>0)
    {
        $result = array_map (function($v){
             return trim($v);
          },
          explode (',',$matches[1]));
        break;
    }
print_r($result);

Автор: NZero 23.10.2014, 16:20
Сделал так
Код

<?php
$file=file('home.php');
foreach($file as $line):
    if(stristr($line, "keywords"))
    {
        $reg='/content="(.*)"/i';//регулярное выражение
        preg_match($reg, $line, $title);//выполняю регулярное выражение

    }
endforeach;
echo $title[1];
?>

Автор: s0lman 23.10.2014, 16:27
Цитата(NZero @  23.10.2014,  15:20 Найти цитируемый пост)
if(stristr($line, "keywords"))

Если проверять на вхождение, тогда, дума, лучше http://php.net/manual/en/function.strpos.php

Автор: baldina 24.10.2014, 09:43
Цитата(NZero @  23.10.2014,  16:20 Найти цитируемый пост)
content="(.*)"

может не работать, т.к. (.*) может содержать "
т.е. например в строке '<meta keywords="" content="a,b,c"><meta charset="utf-8">' в подстановку попадет
'a,b,c"><meta charset="utf-8'

надо пожаднее, (.*?)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)