LINUX.ORG.RU

Обработка строк в php. Помогите!

 ,


0

1

Всем привет. Недавно начал изучать php из-за кое-каких нужд. И так, задача - принять файлик, считать каждую строку, и каждый символ в каждой строке обнести нужным текстом. А в конце строки, или в начале новой, воткнуть <br> У нас будет, допустим, просто цифра 1.

Например, у нас есть файл, в котором три строки:

blablabla bla kokoko ko

Пишу следующий код(быдлокод):

        while ( $i < strlen($readfile[$a])) {
        		fwrite ($writefile, '1'.$readfile[$a][$i]);
                $i++;
                if ( $i == strlen($readfile[$a])) {
                        $i = 0;
                        $a++;
                        fwrite($writefile, "<br>");

А получается:

1b1l1a1b1l1a1b1l1a1 1b1l1a1
<br>1k1o1k1o1k1o1 1k1o1
<br>

В общем, додуматься не могу. Что не так? Подскажите пожалуйста. Читать маны - и так читаю, только начинаю осваивать php.

        while ( $i < strlen($readfile[$a])) {
        		fwrite ($writefile, '1'.$readfile[$a][$i]);
                $i++;
                if ( $i == strlen($readfile[$a])) {
                        $i = 0;
                        $a++;
                        fwrite($writefile, "<br>");

Логику этого я так понимаю: Пока i меньше чем длина нулевой строки (a равно 0) писать в файл цифру 1, потом нулевой(i равно 0) символ первой строки, и если i станет равно длине строки 0, то i обнулить, a «a» увеличить на 1, и записать в строку <br>

Правильно ли я всё это понимаю? Может быть моя логика не вяжется с логикой php.

blablacon ()
$data = file_get_contents('./data.txt');
echo $data;

$result = '';
$len = strlen($data);
$i = 0;
while ($i < $len) {
    $char = $data[$i];
    if ($char !== PHP_EOL) {
        $char = '-' . $data[$i];
    }
    $result .= $char;
    $i++;
}
$result = nl2br($result);
echo $result;

-----------------

$ php t.php
line_1
line_2
line_3
-l-i-n-e-_-1<br />
-l-i-n-e-_-2<br />
-l-i-n-e-_-3<br />

Kilte ★★★★★ ()
Ответ на: комментарий от blablacon

Зачем так усложнять? Ниже выше решение. Есть nl2br. Если нужно на что-то другое заменить, то воспользуйся preg_replace или разбей данные на массив строк и объедини с нужным значением.

Kilte ★★★★★ ()

Хотя моё решение тоже немного странное. Думаю тут вполне можно будет обойтись регулярками. Но я в них как-то не очень шарю.

Kilte ★★★★★ ()
Ответ на: комментарий от Kilte

Потому что только начинаю учит php, и нифига не знаю, а что-то слепить хочется уже. :) Спасибо большое, сейчас попробую. Но пока тему закрывать не буду. ;)

blablacon ()
Ответ на: комментарий от Kilte

Я вообще сначала хотел написать на bash, и запихать скрипт в какой-нибудь cgi-bin, т.к. больше ничего не умею, а надо сделать скрипт вебный. :) Так что любые решения, хоть странные, хоть нет - сойдут. :)

blablacon ()
Ответ на: комментарий от Kilte

Только вот не могу понять, почему скрипт выводит

line_1 line_2 line_3

Можешь объяснить, пожалуйста?

blablacon ()
Ответ на: комментарий от menangen

На php-говнокодеров спроса больше на рынке. :)

А так параллельно учу Python, пишу всякую хрень на Баше.

blablacon ()
Ответ на: комментарий от blablacon

Так уже никто сто лет не делает. Поставь питон, там можно легко писать свои сервера и fast-cgi программы с пол-пинка. Которые делают всё что ты хочешь как скрипт. Реально всё очень просто.
http://www.tutorialspoint.com/python/python_cgi_programming.htm
https://pythonhosted.org/Flask-Actions/

menangen ★★★★★ ()
Ответ на: комментарий от menangen

Ну это ясно что никто не делает, но у меня выбора особо не было. :) На Баше я могу написать это, на чём-то другом - нет. Выбор пал на php, т.к. самый попсовый веб-язык.

Как-нибудь попробую на Python, спасибо. :)

blablacon ()
for line in input.readlines():
    stripped_line = line[:-1] if line.endswith('\n') else line
    output.write('1'.join(stripped_line).join('11'))
    if line.endswith('\n'):
        output.write('<br>')

осталось только на PHP перевести

MyTrooName ★★★★★ ()
Последнее исправление: MyTrooName (всего исправлений: 2)
Ответ на: комментарий от MyTrooName

получится не 1b11l11a11b1... ?

Именно, но ведь это и значит «каждый символ в каждой строке обнести нужным текстом». В любом случае не вижу смысла городить цикл, когда можно обойтись регуляркой.

no-such-file ★★★★★ ()
Ответ на: комментарий от blablacon

Так уже никто сто лет не делает. Поставь Rust, там можно легко писать свои сервера и fast-cgi программы с пол-пинка. Которые делают всё что ты хочешь как скрипт. Реально всё очень просто.

umren ★★★★★ ()
Ответ на: комментарий от blablacon

Видишь, сверху уже комментатор подтверждает мои слова про Python :D

menangen ★★★★★ ()

так?

foreach(explode("\n", file_get_contents("test.txt")) as $s)
    echo preg_replace('/(.)/', '1$1', $s)."1<br/>\n";

KRoN73 ★★★★★ ()
Последнее исправление: KRoN73 (всего исправлений: 1)

Не совсем понятно, что ты хочешь оборачивать, каждый символ в отдельности, или слова. Если второе, то на js я бы так примернно решил


unix_string="foo Bar baz\nfoo bar baz\nfoo bar baz"
win_string="foo Bar baz\r\nfoo bar baz\r\nfoo bar baz"

r=function(str){
str=str.replace(/([^\s]+)/gim, "!!!$1!!!")
str=str.replace(/([^\r\n]+)/g, "$1<br>")
//str=str.replace(/(^.*$)/gm, "$1<br>") // в твоем яп вoзможно прокатит так
return str
}

console.log(r(unix_string))
console.log(r(win_string))

//  !!!foo!!! !!!Bar!!! !!!baz!!!<br>
//  !!!foo!!! !!!bar!!! !!!baz!!!<br>
//  !!!foo!!! !!!bar!!! !!!baz!!!<br>
//  !!!foo!!! !!!Bar!!! !!!baz!!!<br>
//  !!!foo!!! !!!bar!!! !!!baz!!!<br>
//  !!!foo!!! !!!bar!!! !!!baz!!!<br>

А пехапе я не знаю, но возможно регулярки подойдут, там обрати внимание на обработку концов строк в разных режимах. А если символы надо оборачивать, что сомнительно (ибо нах*я?), то выше вроде уже подсказали.

linux-101 ()
Ответ на: комментарий от qnikst

Я так понимаю, это обертка символов будет? А как выглядит обертка слов? Если не затруднит, просто интересно, (без регекспов)? Напишит пжста, то же самое, только с оберткой слов.

linux-101 ()

ышшо один вариант, для нелюбитей регулярок:

foreach(file('text.txt') as $line) {
echo '<symbol>'.implode('</symbol><symbol>',explode('',$line)).'</symbol><br />';
}
где-то так..

MKuznetsov ★★★★★ ()
Последнее исправление: MKuznetsov (всего исправлений: 1)
Ответ на: комментарий от MKuznetsov

explode("

Будет warning «Empty delimiter». Так тоже много лет назад практиковал, но уже давно как:

Если delimiter является пустой строкой (""), explode() возвращает FALSE

KRoN73 ★★★★★ ()
Ответ на: комментарий от KRoN73

Если delimiter является пустой строкой (""), explode() возвращает FALSE

свинство какое :(

просто привык в tcl: [split $line {}] разобрать по символам, а просто split $line по элементам(словам)..и join в обратную чторону

всё-ж php какой-то странный, чего-то в нём не аллё :-)

MKuznetsov ★★★★★ ()
Последнее исправление: MKuznetsov (всего исправлений: 2)
Ответ на: комментарий от KRoN73

через preg_xxx неспортивно :) это-ж вроде как расширение языка, да и вообще наверное одной регуляркой на весь файл можно обойтись, хотя пятница и в основном заботит как запнуть в машину невпихуемое..:-)

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

через preg_xxx неспортивно :) это-ж вроде как расширение языка,

o_O Это обычная стандартная функция, как и в любом другом языке.

да и вообще наверное одной регуляркой на весь файл можно обойтись

Можно так:

php -r 'echo preg_replace(["/(.)/", "/\n/"], ["-$1","-<br/>\n"], "abc\nqwe\n");'
-a-b-c-<br/>
-q-w-e-<br/>

KRoN73 ★★★★★ ()

вопрос совсем не простой, если ты про русский текст в utf-8

для англ. текста всё просто:

#!/usr/bin/php
<?php

$text = "abc
def
ghi";

$text = preg_replace("#.#i", "-$0+", $text);
$text = preg_replace("#$#m", "<br />", $text);
echo "$text";

?>

emulek ()
Ответ на: комментарий от no-such-file

preg_replace('/(.)/'

скобки лишние и напоминают дырку от задницы.

emulek ()
Ответ на: комментарий от linux-101

Пустые строки надо игнорировать, по хорошему-то.

в первом посте такого не было. Ну игнорируй, раз тебе так хочется.

/^\s*$/b

emulek ()

emulek KilteKRoN73 Чуваки, извиняюсь что дёргаю, у меня ещё появился вопрос. Как можно в Php сделать так, чтобы интерпретатор обрабатывал только какие-либо строки? Например, есть файл, в нём 500 строк, и нужно в первую воткнуть букву "а", во вторую букву "б", и так далее, до восьмой, а потом начать всё сначала? То есть девятая строка будет уже как первая.

blablacon ()

emulek Kilte KRoN73 Чуваки, извиняюсь что дёргаю, у меня ещё появился вопрос. Как можно в Php сделать так, чтобы интерпретатор обрабатывал только какие-либо строки? Например, есть файл, в нём 500 строк, и нужно в первую воткнуть букву «а», во вторую букву «б», и так далее, до восьмой, а потом начать всё сначала? То есть девятая строка будет уже как первая.

С предыдущим сообщением что-то случилось, извиняюсь.

blablacon ()
Ответ на: комментарий от blablacon

Решение в лоб. Разбиваешь строку помощью explode. К примеру: explode(«\n», $data);

С помощью цикла обходишь массив и в зависимости от условия подставляешь необходимый символ. Далее implode(«\n», $array).

Ну и, собственно, всё.

Kilte ★★★★★ ()
<?php

//$in = file_get_contents('file.name');
$in = 'yoba
lalka
sasai
';

function do_smth($in, $sym_replace, $sym_to, $nl = "<br/>\n")
{
    return implode('', array_map(
        function($t) use ($sym_replace, $sym_to) {
            return str_replace($sym_replace, $sym_to, $t) . "<br/>\n";
        },
        explode("\n", $in)
    ));
}
$out = do_smth($in, 'a', '<i>A</i>');

var_dump($in, $out);
anonymous ()
Ответ на: комментарий от blablacon
<?php

//$in = file_get_contents('file.name');
$in = 'раз
два
три
четыре
пять
шесть
семь
восемь
девять
десять';

function do_smth_else($in, $range)
{
    return implode('', array_map(
        function($t, $i) use ($range) {
            return $range[$i % count($range)] . ". $t\n";
        },
        explode("\n", $in),
        range(0, count(explode("\n", $in)) - 1)
    ));
}
$out = do_smth_else($in, range('a', chr(ord('a') + 7)));

var_dump($in, $out);
anonymous ()
Ответ на: комментарий от blablacon

интерпретатор обрабатывал только какие-либо строки? Например, есть файл

засунь файл в массив. ЕМНИП функция так и называется — file().

emulek ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.