Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: помогите с регулярными выражениями в пхп  (Прочитано 14862 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Axe Ilshat
Гость
« : 13-03-2004 13:28 » 

У меня с ними совсем плохо.
Можно с их помощью удалить из строки некоторые слова?
Например такие как onmouseover? Улыбаюсь
Щас только дошло что можно в разрешенный тег <b> загнать все что угодно. Это нужно срочно, тк форум уже вовсю работает Улыбаюсь Сенкс.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 13-03-2004 14:09 » 

http://www.php.net/manual/ru/function.preg-replace.php

$output_string = preg_replace('/onmouseover/ig','',$input_string);
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Axe Ilshat
Гость
« Ответ #2 : 13-03-2004 16:52 » 

Спасибо огромное  Отлично
Записан
Девушка
Гость
« Ответ #3 : 30-03-2010 16:02 » 

Здравствуйте, уважаемые администраторы!
Можете объяснить, как правильно работать с результатами, получаемыми при выполнении регулярных выражений.
У меня появилась проблема при обращении к получаемому массиву результатов.
В чём ошибка никак не могу понять(

Уже написала более простую программку, чтобы понять в чём ошибка, но так и не нашла.

Вот мой код:

Код:
function vivod($n)
{
  ?>
  <pre>
  <?php
  print_r
($n);
  
?>

  </pre>
  <?php
};

$file_array file("pt.pkt ");

if(!
$file_array)
{
  echo(
"Ошибка открытия файла");
}
else
{
  
$i=0;

  while (
$i<count($file_array))
  {
    if(
preg_match_all("/^\s*\<\/\s*([A-zА-Яа-яёЁ\d\s]+)\s*\>\s*$/i",$file_array[$i], $zt))
    {
      
vivod($zt);
      
vivod("значение $zt[1][0]");
    }

    if(
preg_match_all("/^\s*\<\s*([A-zА-Яа-яёЁ\d\s]+)\s*\>\s*$/i",$file_array[$i], $ot))
    {
      
vivod($ot);
      
vivod("значение $ot[1][0]");
    }

    if(
preg_match_all("/^\s*\<\s*([A-zА-Яа-яёЁ\d\s]+)\s*\>\s*([A-zА-Яа-яёЁ\d\s]+)\s*\<\/\s*([A-zА-Яа-яёЁ\d\s]+)\s*\>\s*$/i",$file_array[$i], $zn))
    {
      
vivod($zn);
      
vivod("значение $zn[1][0]");
      
vivod("значение $zn[2][0]");
    }

    
$i++;
  }
}

Вот содержание файла pt.pkt:

Код:
<PERSON>
 </DOCUMENT>
<T01FAM>ВОЛОБУЕВ</T01FAM>

А вот результат, который получается:

Код:
  Array
(
    [0] => Array
        (
            [0] =>

        )

    [1] => Array
        (
            [0] => PERSON
        )

)

   значение Array[0]
   Array
(
    [0] => Array
        (
            [0] =>  

        )

    [1] => Array
        (
            [0] => DOCUMENT
        )

)

   значение Array[0]
   Array
(
    [0] => Array
        (
            [0] => ВОЛОБУЕВ
        )

    [1] => Array
        (
            [0] => T01FAM
        )

    [2] => Array
        (
            [0] => ВОЛОБУЕВ
        )

    [3] => Array
        (
            [0] => T01FAM
        )

)

   значение Array[0]
   значение Array[0]

Подскажите пожалуйста, как обращаться к массиву, чтобы получить значения.
« Последнее редактирование: 30-03-2010 16:28 от RXL » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 30-03-2010 16:34 » 

Девушка, форматируй код и обрамляй его тегом [code] [/code]. Это для твоего же блага: читать неформатированную кашу невозможно и отвечать, соотв., тоже не захочется. Это обычное уважение к собеседникам - не забывай об этом!
Я твой код переформатировал. В след. раз - сама делай.

Собственно, код то не нужен - он непонятно о чем. Лучше объясни словами, что тебе было непонятно в оригинальной документации.
Описание функции тут: http://ru2.php.net/manual/en/function.preg-match-all.php

Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 30-03-2010 16:51 » 

Код:
function vivod($n)
{
  ?>
  <pre>
  <?php
  print_r
($n);
  
?>

  </pre>
  <?php
};
Вах... где училась?
Неужели сложно использовать функции echo или print?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Девушка
Гость
« Ответ #6 : 30-03-2010 16:52 » 

Спасибо, учту на будущее)
Мне не понятно почему, если я напрямую обращаюсь к элементу массива ($zt[1][0]), мне выдаётся такая строчка: Array[0] , когда в выводе видно, что там находится значение.
Записан
Девушка
Гость
« Ответ #7 : 30-03-2010 17:00 » 

Sla, училась самостоятельно, через интернет.
А функция вывода на экран мне нужна лишь для того, чтобы посмотреть, что содержится в массиве.
Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 30-03-2010 17:54 » 

Простой тест (находит числа, длинной 2 и более цифр и в первую группу попадает первая цифра, а во вторую - все остальные):

Код:
<?php

$str 
"1222 3444 5666";
preg_match_all(&#39;/\b(\d)(\d+)\b/&#39;, $str, $a);
print_r($a);

?>


Результат:

Код:
Array
(
    [0] => Array
        (
            [0] => 1222
            [1] => 3444
            [2] => 5666
        )

    [1] => Array
        (
            [0] => 1
            [1] => 3
            [2] => 5
        )

    [2] => Array
        (
            [0] => 222
            [1] => 444
            [2] => 666
        )

)

Читаем доку:
Параметр flags.
Цитата
If no order flag is given, PREG_PATTERN_ORDER is assumed

Цитата
PREG_PATTERN_ORDER
Orders results so that $matches[0] is an array of full pattern matches, $matches[1] is an array of strings matched by the first parenthesized subpattern, and so on.

Пересказ: в $matches[0] попадают фрагменты строки, захваченные всем регулярным выражением, в $matches[1] - фрагменты, захваченные первой группой (скобками), в $matches[2] - второй и т.д.

Это было о preg_match_all.

Теперь о твоей ошибке: ты заключила в кавычки $zt[1][0].
Такой вот наглядный тест:

Код:
<?php

$a 
= array(
    
1,
    array(
23)
);

echo 
"$a[0]\n";
echo 
"$a[0][1]\n";
echo 
"$a[1]\n";
echo 
"$a[1][0]\n";

?>


Нулевой элемент - скаляр, первый элемент - массив.
При заключение строки в двойные кавычки происходит ее интерполяция. При этом ищутся внутри упоминания переменных (например, "$v") и элементов массива (например, "$a[1]"). НО, массивы в PHP одномерные! Т.е. выражение "$a[1][0]" означает тоже, что и "$a[1]" . "[0]" !
Результат это наглядно демонстрирует:

Код:
1
1[1]
Array
Array[0]

Якобы двухмерность массива достигается тем, что в первом уровне хранятся ссылки на массивы, составляющие второй уровень.

$zt[1] - это ссылка на массив.
$zt[1][0] - нулевой элемент в одномерном массиве, ссылка на которой хранится как первый элемент массива $zt.


Теперь понятно?
« Последнее редактирование: 30-03-2010 17:56 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Девушка
Гость
« Ответ #9 : 30-03-2010 18:09 » 

RXL, Спасибо, я поняла.
Но в моей программе, почему-то всё равно не видит значения(даже когда я обращаюсь $zt[1][0] )

Видимо у меня всё-таки что-то не так(

Большое спасибо, за быстрый ответ и помощь!!!!

Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 30-03-2010 18:23 » 

Посмотри - немного переделал твою программу, для простоты:

Код:
<?php

function vivod($n)
{
    echo 
"<pre>"print_r($ntrue), "</pre>\n";
}

$file_array = array(
    
"<PERSON>\n",
    
" </DOCUMENT>\n",
    
"<T01FAM>ВОЛОБУЕВ</T01FAM>\n"
);

if(!
$file_array)
    die(
"Ошибка открытия файла");

foreach (
$file_array as $line)
{
    if (
preg_match_all("/^\s*\<\/\s*([A-zА-Яа-яёЁ\d\s]+)\s*\>\s*$/i"$line$zt))
    {
      
vivod("значение " $zt[1][0]);
    }
    elseif (
preg_match_all("/^\s*\<\s*([A-zА-Яа-яёЁ\d\s]+)\s*\>\s*$/i"$line$ot))
    {
      
vivod("значение " $ot[1][0]);
    }
    elseif (
preg_match_all("/^\s*\<\s*([A-zА-Яа-яёЁ\d\s]+)\s*\>\s*([A-zА-Яа-яёЁ\d\s]+)\s*\<\/\s*([A-zА-Яа-яёЁ\d\s]+)\s*\>\s*$/i"$line$zn))
    {
      
vivod("значение " $zn[1][0]);
      
vivod("значение " $zn[2][0]);
    }
    else
        echo 
"ERROR: строка не распознана!\n";
}

?>


Результат:

Код:
<pre>значение PERSON</pre>
<pre>значение DOCUMENT</pre>
<pre>значение T01FAM</pre>
<pre>значение ВОЛОБУЕВ</pre>

Пример файла похож на XML, но совершенно невалидный...
« Последнее редактирование: 30-03-2010 18:25 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Девушка
Гость
« Ответ #11 : 30-03-2010 18:50 » new

RXL, Спасибо Вам ещё раз.

Документ действительно состоит из одних тегов, но не xml.

Если это был xml, я бы не мучалась с регулярными выражениями, а разобрала бы его с помощью функций dom xml.

Вы понятно ответили на мой вопрос, за что я Вам очень благодарна!



Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines