Експлодване на текст

C++ JAVA
User avatar
cHuBakA
Нов
Нов
Reactions: 0
Posts: 160
Joined: Thu Sep 22, 2011 1:45 pm

Експлодване на текст

Post by cHuBakA »

Здравейте. Как може да стане? Идеята е експлодването да е само след дума - равна или по-голяма от 5 букви с точка?

Пример :
Едно две шест. Едно две три четири. Едно две пет. Едно две две.

Резултат :
=> Едно две шест. Едно две три четири.
=> Едно две пет. Едно две две.
uphero
Потребител
Потребител
Reactions: 0
Posts: 799
Joined: Mon Feb 20, 2012 12:26 pm
Answers: 35
Location: Казанлък
Contact:

Re: Експлодване на текст

Post by uphero »

Code: Select all

<?php
$string = 'Едно две шест. Едно две три четири. Едно две пет. Едно две две.';
$separator = '.';
$sentences = explode($separator, $string);
foreach ($sentences as $key => $sentence) {
  if (mb_strlen(end(explode(' ', $sentence))) >= 5) {
    $array['clear'] = str_replace($sentence.$separator, '', $string);
    $array['removed'][] = $sentence.$separator;
  }
}

echo "<pre>";
var_dump($array);
User avatar
cHuBakA
Нов
Нов
Reactions: 0
Posts: 160
Joined: Thu Sep 22, 2011 1:45 pm

Re: Експлодване на текст

Post by cHuBakA »

uphero Благодаря за примера. Проблема е че след първото изречение ми вади null. Не знам защо. Аз сглобих това работи и дели изречението през три изречения, обаче го дели само на точка . Чудя се как може да стане да е с горното условие. Да дели само ако преди точката думата е равна или по-голяма от 5 букви?? Демек ако преди точката думата е по-малка от 5 букви да не го дели?

Code: Select all

$sentences = explode(". ", $string);
$new_string = "";
$j = 1;
foreach($sentences as $sentences_el) {
    $new_string .= $sentences_el.".";
    if($j % 3 == 0) {
        $new_string .= "<br><br>";
    }
    $j++;
}
echo $new_string ;
User avatar
djman
Гуру
Гуру
Reactions: 0
Posts: 2833
Joined: Sat Sep 12, 2009 8:07 am
Answers: 111

Re: Експлодване на текст

Post by djman »

Друго решение

Code: Select all

$str = "Едно две шест. Едно две три четири. Едно две пет. Едно две две.";

$res = mb_split('(?<=\S{5,}\.\s)', $str);

print_r($res);
uphero
Потребител
Потребител
Reactions: 0
Posts: 799
Joined: Mon Feb 20, 2012 12:26 pm
Answers: 35
Location: Казанлък
Contact:

Re: Експлодване на текст

Post by uphero »

djman wrote: Wed May 19, 2021 7:10 pm Друго решение

Code: Select all

$str = "Едно две шест. Едно две три четири. Едно две пет. Едно две две.";

$res = mb_split('(?<=\S{5,}\.\s)', $str);

print_r($res);
връща фалсе, иначе ме уби с тоя код :D
Всичко на всичко един ред
User avatar
djman
Гуру
Гуру
Reactions: 0
Posts: 2833
Joined: Sat Sep 12, 2009 8:07 am
Answers: 111

Re: Експлодване на текст

Post by djman »

uphero wrote: Wed May 19, 2021 7:49 pm връща фалсе, иначе ме уби с тоя код :D
Всичко на всичко един ред
Как така, при мен си връща два елемента (php 8.0.6 cli) -
Array
(
[0] => Едно две шест. Едно две три четири.
[1] => Едно две пет. Едно две две.
)
Вярно че всички без последния ще трябва да минат през rtrim.
User avatar
cHuBakA
Нов
Нов
Reactions: 0
Posts: 160
Joined: Thu Sep 22, 2011 1:45 pm

Re: Експлодване на текст

Post by cHuBakA »

И при мен е фалс. PHP 5.6. Може би е заради версията
User avatar
djman
Гуру
Гуру
Reactions: 0
Posts: 2833
Joined: Sat Sep 12, 2009 8:07 am
Answers: 111

Re: Експлодване на текст

Post by djman »

Интересно, явно "variable-length lookbehind" не работи в PHP, освен когато работи :think:

Ето още един вариант...

Code: Select all

$str = "Едно две шест. Едно две три четири. Едно две пет. Едно две две.";

preg_match_all("/(\S.+\b\S{5,}\.)|(\S.+$)/uU", $str, $res, PREG_SET_ORDER);
$res = array_map('current', $res);

var_dump($res);
array(2) {
[0]=>
string(62) "Едно две шест. Едно две три четири."
[1]=>
string(47) "Едно две пет. Едно две две."
}
User avatar
cHuBakA
Нов
Нов
Reactions: 0
Posts: 160
Joined: Thu Sep 22, 2011 1:45 pm

Re: Експлодване на текст

Post by cHuBakA »

djman wrote: Wed May 19, 2021 9:28 pm Интересно, явно "variable-length lookbehind" не работи в PHP, освен когато работи :think:

Ето още един вариант...

Code: Select all

$str = "Едно две шест. Едно две три четири. Едно две пет. Едно две две.";

preg_match_all("/(\S.+\b\S{5,}\.)|(\S.+$)/uU", $str, $res, PREG_SET_ORDER);
$res = array_map('current', $res);

var_dump($res);
array(2) {
[0]=>
string(62) "Едно две шест. Едно две три четири."
[1]=>
string(47) "Едно две пет. Едно две две."
}
djman Интересно всички функции работят от php4 нагоре, но реално не работи. Дали има някъде грешка, която не виждам, как ли не го пробвам, но не успявам да го подкарам
User avatar
Revelation
Web-tourist
Web-tourist
Reactions: 1
Posts: 958
Joined: Sun Mar 24, 2013 1:23 pm
Answers: 68

Re: Експлодване на текст

Post by Revelation »

cHuBakA wrote: Fri May 28, 2021 4:27 am
djman wrote: Wed May 19, 2021 9:28 pm Интересно, явно "variable-length lookbehind" не работи в PHP, освен когато работи :think:

Ето още един вариант...

Code: Select all

$str = "Едно две шест. Едно две три четири. Едно две пет. Едно две две.";

preg_match_all("/(\S.+\b\S{5,}\.)|(\S.+$)/uU", $str, $res, PREG_SET_ORDER);
$res = array_map('current', $res);

var_dump($res);
array(2) {
[0]=>
string(62) "Едно две шест. Едно две три четири."
[1]=>
string(47) "Едно две пет. Едно две две."
}
djman Интересно всички функции работят от php4 нагоре, но реално не работи. Дали има някъде грешка, която не виждам, как ли не го пробвам, но не успявам да го подкарам
http://sandbox.onlinephpfunctions.com/c ... 2ae8a765d1

Кода си работи на 5.6. Ако не работи при теб, значи там където го използваш се чупи. Дай повече код, ако трябва.
Post Reply