Обратные «английские» слова в предложении - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть строка, в которой могут использоваться несколько языков, например:

این متن فارسی است and this is !!! in English
این خط بعدی است و this is going to be continued...

Я хочу только поменять слова на английском, поэтому результат должен выглядеть примерно так:

این متن فارسی است English in !!! is this and
این خط بعدی است و continued be to going is this...

Чтобы текст был перевернут, я получил:

public static function reverseEnglishWords($string)
{
    return preg_replace_callback('/\w+/', function (array $m) { return strrev($m[0]); }, $string);
}

, но он переворачивает все символы.


РЕДАКТИРОВАТЬ: это то, что работает лучше всего сейчас:

<?php
$string = "
این یک تست جدید است
Is my English line working just fine?
I hope it does...
این یک جمله جدید است and this is to be continued in English...
";

$newStr = preg_replace_callback('/\w.*(?=\w|\b)/', function (array $m) { 
    return implode(" ", array_reverse(explode(" ", $m[0])));
}, $string);

echo $newStr;

Единственная проблема с этим - некоторые символы в enf строки, такие как ? и ..., которые не указаны в примере выше.текущий результат:

این یک تست جدید است fine just working line English my Is? does it hope I... این یک جمله جدید است English in continued be to is this and...

, который должен быть:

این یک تست جدید است ?fine just working line English my Is ...does it hope I این یک جمله جدید است ...English in continued be to is this and

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

Вы можете использовать

function reverseEnglishWords($string)
{
    return preg_replace_callback('/(?!\s)[^\p{Arabic}\r\n]+/u', function ($m) { 
            $tmp = preg_replace_callback('~(\w+)([^\w\s]+)~', function($n) {
                return strrev($n[2]) . $n[1];
            }, $m[0]);
            return implode(" ", array_reverse(
                    preg_split('~\s+~u', $tmp, -1, PREG_SPLIT_NO_EMPTY)
                  )
            );
        }, $string);
}

$s = "
این یک تست جدید است
Is my English line working just fine?
I hope it does...
Another one?!
این یک جمله جدید است and this is to be continued in English...
";

echo reverseEnglishWords($s);

См. PHP-демо , вывод

این یک تست جدید است
?fine just working line English my Is
...does it hope I
!?one Another
این یک جمله جدید است ...English in continued be to is this and

Здесь /(?!\s)[^\p{Arabic}\r\n]+/u соответствует одному илибольше последовательных символов (начиная с непробельного символа), которые не принадлежат арабскому алфавиту и не являются CR и LF.Совпадения передаются анонимной функции preg_replace_callback, где совпадение сначала обрабатывается с помощью другого preg_replace_callback для обращения букв и знаков препинания в словах, которые начинаются с букв и заканчиваются пунктуацией (см. (\w+)([^\w\s]+) regex)а затем разделяется с любым видом пробелов Unicode при отбрасывании пустых элементов (см. preg_split('~\s+~u', $m[0], -1, PREG_SPLIT_NO_EMPTY)), array_reverse переворачивает массив найденных «слов», а implode объединяет перевернутые элементы с пробелом.

0 голосов
/ 28 ноября 2018

Вам нужно выбрать строку, которая начинается с английского символа и заканчивается английским символом.Затем в функции обратного вызова разделите строку на пробел и обратный массив, используя array_reverse()

$newStr = preg_replace_callback('/\w.*(?=\w|\b)/', function (array $m) { 
    return implode(" ", array_reverse(explode(" ", $m[0])));
}, $string);

Проверьте результат в demo

0 голосов
/ 28 ноября 2018

Попробуйте:

<?php

function reverseSentence($string)
{
    $array = explode(" ", $string);
    $rarray = array_reverse($array);
    $reversed = implode(" ", $rarray);
    return $reversed;
}

function reverseEnglishWords($string)
{
    return preg_replace_callback('/[\s\w\d]*/', function($m) {
        return reverseSentence($m[0]);
    } , $string);
}

$s = "این متن فارسی است and this is !!! in English";
echo reverseEnglishWords($s);

Вывод:

> $ php example.php
این متن فارسی است is this and !!!English in           
0 голосов
/ 28 ноября 2018

Использовать обратный массив

$str = 'what is you doin';
$str = explode(' ', $str);
$str = array_reverse($str);
echo implode(' ', $str);
...