Php bir dizesinde geçen mektubun konumunu almak nasıl?

6 Cevap php

Örnek bir dize: "Some text.....!!!!!!!!?????"

Nasıl bu örnekte harf t olan son harfi (hatta alphanum karakteri) konumunu almak istiyorsunuz PHP kullanarak?

6 Cevap

Sen preg_match_all with the regular expression \p{L} tüm Unicode harf . With the additional flag PREG_OFFSET_CAPTURE da uzaklıklar almak bulmak için kullanabilirsiniz:

$str = "Some text.....!!!!!!!!?????";
if (preg_match_all('/\p{L}/u', $str, $matches, PREG_OFFSET_CAPTURE) > 0) {
    $lastMatch = $matches[0][count($matches[0])-1];
    echo 'last letter: '.$lastMatch[0].' at '.$lastMatch[1];
} else {
    echo 'no letters found';
}

substr deneyin () ;)

echo substr ('abcdef', -1, 1);

$s = "Some text.....!!!!!!!!embedded?????";

$words = str_word_count($s,2);
$lastLetterPos = array_pop(array_keys($words)) + strlen(array_pop($words)) - 1;
echo $lastLetterPos;

Bunun yerine sadece alfa daha alphanum için izin vermek istiyorsanız:

$s = "Some text.....!!!!!!!!embedded21?????";

$words = str_word_count($s,2,'0123456789');
$lastLetterPos = array_pop(array_keys($words)) + strlen(array_pop($words)) - 1;
echo $lastLetterPos;

Geçerli gibi diğer karakterler eklemek için:

$s = "Some text.....!!!!!!!!embedded!!à?????"; 

$words = str_word_count($s,2,'0123456789ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöùúûüýÿ'); 
$lastLetterPos = array_pop(array_keys($words)) + strlen(array_pop($words)) - 1; 
echo $lastLetterPos; 

Bu, tüm düşünün ne bir mektup bağlıdır, ve "Some!!!???text???!!!", örneğin ile ne yapmak istediğinizi:

Naif çözüm tutmak istediğiniz ilk karakteri bulmak için dizesindeki son konumdan yineleme olacaktır, o zaman dönün. (Ya da daha önce birini dönmek, sonra durdurmak istediğiniz ilk karakteri bulmak için baştan yineleme.)

Yoksa tutmak istediğinizi maç için bir regex kullanabilirsiniz, daha sonra son maçı alır. (Ya son karakterini, daha sonra, saklamak istemiyorum ne kaldırmak için bir regex yerine kullanabilirsiniz.)

Naive:

<?php
    $s = "Some text.....!!!!!!!!?????";
    $ary = str_split($s);
    $position = 0;
    $last = 0;
    foreach ($ary as $char) {
        if (preg_match("/[a-zA-Z0-9]/", $char)) {
            $last = $position;
        }
        $position += 1;
    }
    echo $last;
?>

İşte basit ve düz ileri O (n) algoritması.

Için manuel ctype_alpha():

In the standard C locale letters are just [A-Za-z]

Farklı bir yerel gerekiyorsa, bir karakter alfa olup olmadığını belirleyen fonksiyon soyut gerekir. Bu şekilde bu algoritma tutmak ve değişen dillere adapte edebilirsiniz.

function lastAlphaPosition($string) {
    $lastIndex = strlen($string)-1;
    for ($i = $lastIndex; $i > 0; --$i) {
        if (ctype_alpha($string[$i])) {
            return $i;
        }
    }
    return -1;
}

$testString = 'Some text.....!!!!!!!!?????';
$lastAlphaPos = lastAlphaPosition($testString);

if ($lastAlphaPos !== -1) {
    echo $testString[$lastAlphaPos];
} else {
    echo 'No alpha characters found.';
}