Поиск подстроки

Здравствуйте.
Помогите, пожалуйста, найти подстроку, которая начинается с первого символа в переменной $text и закончить поиск надо будет, когда закончится первые 3 слова, каждое из которых больше 3-х букв.
Можно регуляркой:
PHP:
<?
$text = "РНР лучший в мире язык программирования";
echo preg_replace("'(.*?[\w\S]{3,})(\s.*?[\w\S]{3,})(\s.*?[\w\S]{3,})[^>]*[^>]'", "\\1\\2\\3", $text);
?>
PS. Знаки препинания и т.д. символы, учитываются как буква
PS2. Работает корректно, если нет символов табуляции (думаю, это исправимо)
 
У меня выдаёт Array()
А какая у тебя версия РНР? И в каком виде запускаешь скрипт? Имею ввиду запускаешь так как есть, или внедряешь в какой то скрипт? Если второй вариант, то выложи весь код, будет легче понять де лажа... Дело в том, что пустой массив возвращается когда переменная $text="";
 
Действительно. Это я ошибся, приводя пример.
PHP:
preg_match('#^'.substr($text,0,1).'\S{3,}\s{1,}(\S{1,3}\s{1,})*(\S{4,}\s{1,}(\S{1,3}\s{1,})*){2}|^'.substr($text,0,1).'\S{0,2}\s{1,}(\S{1,3}\s{1,})*(\S{4,}\s{1,}(\S{1,3}\s{1,})*){3}#si', $text, $iskomaya_stroka);
$iskomaya_stroka = preg_replace('#(\s{1,}\S{1,3})*\s*$#i', '', $iskomaya_stroka[0]); //чистим в конце лишние 1-3 символа и пробелы
Поправил. Захватит как надо, и в случае, если первое слово < 4 символов и если оно больше 4 символов.

В исправленном варианте VandJ
PHP:
$iskomaya_stroka = preg_replace("'(.*?[\w\S]{4,})(\s.*?[\w\S]{4,})(\s.*?[\w\S]{4,})[^>]*[^>]'", "\\1\\2\\3", $text);
Но эти два варианта могут по разному работать с памятью, нужно тестить на крупных объемах текста, если такие будут подставляться. Если же все тексты малюсенькие и измеряются в килобайтах, то лучше вариант от VandJ (в рамках решений регулярками)

UPD
Правда в его варианте не включена первая буква и нужно додумывать регулярку.
Вот проапгрейдженый вариант на базе регулярки VandJ
PHP:
if(preg_match('#(\s|^)('.substr($text,0,1).'[\w\S]{3,}|'.substr($text,0,1).'.*?[\w\S]{4,})(\s.*?[\w\S]{4,})(\s.*?[\w\S]{4,})(\s|$)#', $text, $iskomaya_stroka))
$iskomaya_stroka = $iskomaya_stroka[2] . $iskomaya_stroka[3] . $iskomaya_stroka[4];
 
В исправленном варианте VandJ
PHP:
$iskomaya_stroka = preg_replace("'(.*?[\w\S]{4,})(\s.*?[\w\S]{4,})(\s.*?[\w\S]{4,})[^>]*[^>]'", "\\1\\2\\3", $text);
Но эти два варианта могут по разному работать с памятью, нужно тестить на крупных объемах текста, если такие будут подставляться. Если же все тексты малюсенькие и измеряются в килобайтах, то лучше вариант от VandJ (в рамках решений регулярками)
UPD
Правда в его варианте не включена первая буква и нужно додумывать регулярку.
Вот проапгрейдженый вариант на базе регулярки VandJ
PHP:
if(preg_match('#^('.substr($text,0,1).'[\w\S]{3,}|'.substr($text,0,1).'.*?[\w\S]{4,})(\s.*?[\w\S]{4,})(\s.*?[\w\S]{4,})\s#', $text, $iskomaya_stroka))
$iskomaya_stroka = $iskomaya_stroka[1] . $iskomaya_stroka[2] . $iskomaya_stroka[3];
Вроде работает и с первой буквой…
PHP:
<?
$text = "Да, и РНР лучший в мире язык программирования";
$iskomaya_stroka = preg_replace("'(.*?[\w\S]{4,})(\s.*?[\w\S]{4,})(\s.*?[\w\S]{4,})[^>]*[^>]'", "\\1\\2\\3", $text);
echo $iskomaya_stroka; //Да, и РНР лучший в мире язык 
?>
 
Вроде работает и с первой буквой…
Здравствуйте.
Помогите, пожалуйста, найти подстроку, которая начинается с первого символа в переменной $text и закончить поиск надо будет, когда закончится первые 3 слова, каждое из которых больше 3-х букв.
Вот этого в регулярке собственно и не было. Кстати поправил свой пост, т.к. искало только если первая буква самая первая в строке и не учитывался конец строки вместо последнего пробела.
 
Регуляркой быстрее будет?
 
Назад
Сверху