Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Выделение отрицательных и положительных чисел.
 
 автор: Maxam   (01.09.2009 в 12:57)   письмо автору
 
 

Есть текст, например:
Потребительское кредитование -635 млн фунтов с +223 млн.

Нужно выделить в нём числа с минусом и плюсом:
Потребительское кредитование <font color="red">-635</font> млн фунтов с <font color="green">+223</font> млн.


Как это сделать?

P.S. Важно! Только если числа не находятся в ссылке, например:
<a href="http...">Потребительское кредитование -635 млн фунтов с +223 млн.</a>

  Ответить  
 
 автор: cheops   (01.09.2009 в 16:14)   письмо автору
 
   для: Maxam   (01.09.2009 в 12:57)
 

Можно начать отталкиваться от следующего решения.
<?php
  $text 
"Потребительское кредитование -635 млн фунтов с +223 млн.";
  
$pattern "|\+[\d]+|";
  
$text preg_replace($pattern"<font color=\"green\">\\0</font>"$text);
  
$pattern "|\-[\d]+|";
  
$text preg_replace($pattern"<font color=\"red\">\\0</font>"$text);
  echo 
$text;
?>

  Ответить  
 
 автор: Maxam   (01.09.2009 в 20:18)   письмо автору
 
   для: cheops   (01.09.2009 в 16:14)
 

Спасибо, работает, но почти!

Если циферки не целые (-0,6%, +3,2%...), то число выделяется не полностью.

  Ответить  
 
 автор: heed   (01.09.2009 в 20:52)   письмо автору
 
   для: Maxam   (01.09.2009 в 20:18)
 

если присмотрется к тому что утверждается метесимволами в регулярном выражении
(я-бы написал например так '#[+-]?\d+#' ) , то можно понять что в конце можно
добавить лишь \.?[\d]* , чтобы включилась ещё и точка с последующими цифрами
(или я бы например может быть написал-бы так '#[+-]?\d+(?:\.\d+)?#' )

> числа не находятся в ссылке
тут придётся или проверять наличие после найденного какого-то колличества "не <" символов
за которыми не будет следовать "</a" (но это только если в солдержимом <a></a> не бывает других тегов) или придётся каждый раз проверять не придёт-ли первым "</a", чем "<a" ,в последующих символах
(, которые могут быть размером приличной длинны, и проверяться очень часто сново и снова, если много цифр и мало <a>)
или так-называемый лексический анализ , например вот как рядом
http://softtime.ru/forum/read.php?id_forum=6&id_theme=67547&page=1
, но с анализированием тегов <a> , и воэможно ещё любых всех тегов , если внутри <td colls="5"> не нужно заменять тоже

  Ответить  
 
 автор: Maxam   (01.09.2009 в 20:26)   письмо автору
 
   для: cheops   (01.09.2009 в 16:14)
 

Да, ещё нюанс. Щас вот попробовал Ваш код, увидел, что есть числа ещё написанные с пробелом:
ОПЕК-11: Производство нефти +335 000 до 26,365 млн

В итоге выделяет:
ОПЕК-11: Производство нефти +335 000 до 26,365 млн

  Ответить  
 
 автор: heed   (01.09.2009 в 20:54)   письмо автору
 
   для: Maxam   (01.09.2009 в 20:26)
 

дубль

  Ответить  
 
 автор: heed   (01.09.2009 в 20:54)   письмо автору
 
   для: Maxam   (01.09.2009 в 20:26)
 

, с запятой тоже нужные цифры? или только с точками?

  Ответить  
 
 автор: Maxam   (01.09.2009 в 21:16)   письмо автору
 
   для: heed   (01.09.2009 в 20:54)
 

Я видел пока только с запятыми, но фиг их знает, может и с точками когда-нибудь напишут...

  Ответить  
 
 автор: heed   (01.09.2009 в 23:20)   письмо автору
 
   для: Maxam   (01.09.2009 в 21:16)
 

у меня только так получилось не выделять цифру где ОПЕК-11
,) при первом рассмотрении
<pre><?
$text
=<<<TXT
ОПЕК-11: Производство нефти +335 000 до 26,365 млн
нефтитанкер2 -335 000 000 000 до 26.365.345 тыщ
нефтитанкер-5
нефтитанкер-5.1.
TXT
;

$pattern =  '/(?:(?<!\w)[-+]|(?<![-+]))' # плюс-минус
# только если не после слов, или совсем не читать цифру после знака
    
.'\b(?:\d+(?:[ ,\.](?=\d))?)+/';
# цифры, за которыми могут быть пробелы с точками и запятыми , за которыми опять цифры

preg_match_all($pattern$text$out,2);
print_r($out);
?>

из нефтитанкер-5.1. совпадёт 1
и вообще позволяется записать вместо 0.9 просто .9 (здесь не предусмотренно)

  Ответить  
 
 автор: Maxam   (02.09.2009 в 00:20)   письмо автору
 
   для: heed   (01.09.2009 в 23:20)
 

Сделал так:
<?php
$file
[$i]=preg_replace('# (\d+),(\d+)%#','<span class="add">\\0</span>',$file [$i]);
$file[$i]=preg_replace('# (\d+),(\d+)#','<span class="add">\\0</span>',$file[$i]);
$file[$i]=preg_replace('#\+(\d+) (\d+)#','<span class="g">\\0</span>',$file[$i]);
$file[$i]=preg_replace('#\+(\d+),(\d+)%#','<span class="g">\\0</span>',$file[$i]);
$file[$i]=preg_replace('#\-(\d+) (\d+)#','<span class="a">\\0</span>',$file[$i]);
$file[$i]=preg_replace('#\-(\d+),(\d+)%#','<span class="a">\\0</span>',$file[$i]);
?>

  Ответить  
 
 автор: heed   (02.09.2009 в 01:16)   письмо автору
 
   для: Maxam   (02.09.2009 в 00:20)
 

то-же самое в трёх выражениях
<?
$file
[$i]=preg_replace('# \d+,\d+%?#','<span class="add">\\0</span>',$file [$i]); 
$file[$i]=preg_replace('#[+-]\d+,\d+%#','<span class="g">\\0</span>',$file[$i]); 
$file[$i]=preg_replace('#[+-]\d+ \d+#','<span class="g">\\0</span>',$file[$i]); 


// upd
не заметил три разных класса ,
тогда только два первых можно заменить одним

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования