1
votes

Comment supprimer des points (.) À la fin d'une chaîne en PHP

J'ai une chaîne (titre wordpress) appelée "5 Fragen an ... xyz" Après avoir supprimé une balise HTML, les points de ce titre devraient être supprimé / remplacé. Je sauf que la chaîne affiche «xyz» uniquement

<?php
$wptitle = get_the_title($post->id); // getwordpress title
$wptitle = strip_tags($wptitle);    // remove a <br> tag
$wptitle = preg_replace('/\.(?=.*\.)/', ' ', $wptitle); // want to remove the dots
$wptitle = str_replace('5 Fragen an', '', $wptitle); // remove the part 5 Fragen an
echo $wptitle
?>


3 commentaires

Est-ce toujours trois points? Si tel est le cas, quelque chose utilisant explode () pourrait le faire.


La chaîne affiche «xyz» car vous avez supprimé le reste avec le str_replace . Si vous voulez supprimer trois points, faites simplement un str_replace sur trois points.


Si c'est TOUJOURS trois points. $ output = str_replace ('...', '', 'mystring ...');


3 Réponses :


2
votes

D'accord, j'avais d'abord fourni la mauvaise réponse.

J'ai donc créé un script pour vous.

// function description here 
// https://stackoverflow.com/questions/15944824/search-a-php-array-for-partial-string-match/15944913#15944913
function array_search_partial(string $keyword, array $arr): int {
    foreach($arr as $index => $string) {
        if ( strpos($string, $keyword) !== false ) {
            return $index;
        }
    }
}

function NewTitle(string $string): string{

    // Here we split string into an array, and glue is " "
    $string = explode(' ', $string);

    // Now we search for a dots in array and $count getting number of key where is the dots
    $count = array_search_partial("..", $string);

    // Because we found a dots on some key (Let's say 3 key),
    // We shift the array because we don't need first words and dots in our title
    // Because the dots are on key 3 we must then shift 4 times array to remove dots and unnecessary words
    for($i=0;$i < $count+1;$i++){
        array_shift($string);
    }

    // Here we join array elements in a string with a " " glue
    $string = implode(' ', $string);

    // returning an new string
    return $string;
}


echo NewTitle("5 Fragen an ... xyz some new title for blog "); 
//OutPut: xyz some new title for blog


7 commentaires

Il ne semble pas que les points soient en fait à la toute fin de la chaîne.


C'est vrai mon mal, je vais fournir une meilleure réponse pendant quelques minutes.


@GrumpyCrouton je l'ai corrigé


Vous avez une déclaration de fonction <à l'intérieur d'une autre fonction?


@GrumpyCrouton je viens de le déplacer


À mon avis, votre solution semble un peu exagérée pour son objectif. J'ai supprimé mon vote défavorable, mais je ne pense pas qu'il soit dû à un vote favorable. Cela changerait peut-être si vous décriviez ce que fait réellement votre code, pourquoi cette solution est logique à utiliser.


@GrumpyCrouton Je pense que maintenant c'est beaucoup mieux :)



2
votes

Utilisez rtrim pour supprimer des points (.) ou d'autres caractères à la fin d'une chaîne en PHP. Avec le paramètre character_mask, vous pouvez spécifier les caractères que vous souhaitez supprimer à la fin.

Exemple avec des points:

$title = ltrim(strpbrk($input , "." ),'. ');

echo $title; //xyz some new title for blog

C'est la réponse à la question dans le titre.

Mise à jour: p>

Si la chaîne d'entrée ressemble à ceci

$input = "5 Fragen an ... xyz some new title for blog ";

vous pouvez le faire pour extraire la chaîne après les points:

$string = "remove dots (.) at the end of an string ...";
$string = rtrim($string,'.');
var_dump($string);
//string(40) "remove dots (.) at the end of an string "


1 commentaires

Une autre réponse a précédemment donné cette même solution, mais il a également été souligné que les . ne sont pas à la fin de la chaîne.



1
votes

Le modèle que vous avez essayé \. (? =. * \.) correspond à un point \. et utilise une anticipation positive (? = code> affirmant que ce qui est à droite est un point.

Dans vos données d'exemple, cela ne correspondra qu'à 2 points sur 3 car pour le dernier point, l'assertion échouera.

Si vous voulez faire correspondre les 1 derniers points consécutifs ou plus, vous pouvez utiliser une anticipation négative (?! à la place en affirmant que ce qui est à droite ne suit plus de points.

\b5 Fragen an\h+\.+\h+


0 commentaires