2017-01-12 4 views
3

Ich habe Variablen wie folgt aus:Wie bekomme ich die letzte ganze Zahl in einer Zeichenkette?

$path1 = "<span class='span1' data-id=2>lorem ipsum</span>"; 
$path2 = "<span class='span2' data-id=14>lorem ipsum</span>"; 

Ich brauche Wert von data-id zu bekommen, aber ich denke, es ist in PHP nicht möglich ist.

Vielleicht ist es möglich, die letzte ganze Zahl in einer Zeichenfolge zu erhalten? Etwas wie:

$a = $path1.lastinteger(); // 2 
$b = $path2.lastinteger(); // 14 

Irgendwelche Hilfe?

Antwort

1

Sie könnten eine einfache regex verwenden:

/data-id=[\"\']([1-9]+)[\"\']/g 

Dann können Sie diese Funktion bauen:

function lastinteger($item) { 
    preg_match_all('/data-id=[\"\']([1-9]+)[\"\']/',$item,$array); 

    $out = end($array); 

    return $out[0]; 
} 

Arbeiten DEMO.

Der vollständige Code:

function lastinteger($item) { 
    preg_match_all('/data-id=[\"\']([1-9]+)[\"\']/',$item,$array); 

    $out = end($array); 

    return $out[0]; 
} 

$path1 = "<span class='span1' data-id=2>lorem ipsum</span>"; 
$path2 = "<span class='span2' data-id=14>lorem ipsum</span>"; 

$a = lastinteger($path1); //2 
$b = lastinteger($path2); //14 

Referenzen:

Tutorial für regex: tutorialspoint.com

Gutes Werkzeug erstellen regex: regexr.com

1

Je nachdem, wie diese Variablen gesetzt bekommen, könnte eine Lösung sein die ganze Zahl erste zu bekommen und es dann in die Wege zu injizieren:

$dataId = 2; 
$path1 = "<span class='span1' data-id='$dataId'>lorem ipsum</span>"; 

(Beachten Sie, dass ich Anführungszeichen um die Daten-ID-Wert hinzugefügt Andernfalls ist Ihr HTML-Code ungültig.)

Wenn Sie die Zeichenfolgen nicht selbst erstellen, sondern analysieren müssen, würde ich nicht einfach die letzte Ganzzahl erhalten. Der Grund dafür ist, dass Sie ein Tag wie folgt erhalten könnte:

<span class='span1' data-id='4'>Happy 25th birthday!</span> 

In diesem Fall ist die letzte Zahl im String 25, das ist nicht das, was Sie wollen. Stattdessen würde ich einen regulären Ausdruck verwenden, den Wert der Daten-id-Attribut zu erfassen:

$path1 = "<span class='span1' data-id='2'>lorem ipsum</span>"; 
preg_match('/data-id=\'(\d+)\'/', $path1, $matches); 
$dataId = $matches[1]; 
echo($dataId); // => 2 
1

Ich denke, dass Sie Regex zum Beispiel verwendet werden soll: Dieser Wille Ausgang

<?php 
$paths = []; 
$paths[] = '<span class=\'span1\' data-id=2>lorem ipsum dolor</span>'; 
$paths[] = '<span class=\'span2\' data-id=14>lorem ipsum</span>'; 
foreach($paths as $path){ 
    preg_match('/data-id=([0-9]+)/', $path, $data_id); 
    echo 'data-id for '.$path.' is '.$data_id[1].'<br />'; 
} 

:

Daten-ID für Lorem ipsum dolor 2

Daten-ID für lorem ipsum ist 14

1
function find($path){ 

$countPath = strlen($path); 

for ($i = 0; $i < $countPath; $i++) { 

    if (substr($path, $i, 3) == "-id") { 

     echo substr($path, $i + 4, 1); 

    } 
}}find($path1); 
1

Schrieb eine sachgemäße Funktion für diesen Zweck.

function LastNumber($text){ 
    $strlength = strlen($text); // get length of the string 
    $lastNumber = '';    // this variable will accumulate digits 
    $numberFound = 0;    

    for($i = $strlength - 1; $i > 0; $i--){ // for cicle reads your string from end to start 
     if(ctype_digit($text[$i])){ 
      $lastNumber = $lastNumber . $text[$i]; // if digit is found, it is added to last number string; 
      $numberFound = 1; // and numberFound variable is set to 1 
     }else if($numberFound){ // if atleast one digit was found (numberFound == 1) and we find non-digit, we know that last number of the string is over so we break from the cicle. 
      break; 
     } 
    } 
    return intval(strrev($lastNumber), 10); // strrev reverses last number string, because we read original string from end to start. Finally, intval function converts string to integer with base 10 
} 
1

Ich weiß, das beantwortet wurde, aber wenn Sie wirklich die letzte int in einer Linie bekommen möchten, ohne speziell auf Attribute oder Tag-Namen zu beziehen, sollten Sie diese verwenden.

$str = " 
asfdl;kjas;lkjfasl;kfjas;lf 999 asdflkasjfdl;askjf 
<span class='span1' data-id=2>lorem ipsum</span> 
<span class='span2' data-id=14>lorem ipsum</span> 


Look at me I end with a number 1234 
"; 


$matches = NULL; 
$num = preg_match_all('/(.*)(?<!\d)(\d+)[^0-9]*$/m', $str, $matches); 

if (!$num) { 
    echo "no matches found\n"; 
} else { 
    var_dump($matches[2]); 
} 

Es wird ein Array aus einer mehrzeiligen Eingabe der letzten Zahlen für jede Zeile zurück:

array(4) { 
    [0] => 
    string(3) "999" 
    [1] => 
    string(1) "2" 
    [2] => 
    string(2) "14" 
    [3] => 
    string(4) "1234" 
} 
+0

sehr interessant, danke – bonaca

2

Wenn Sie lieber nicht mit einem regulären Ausdruck würden Sie den DOM-API verwenden können:

$dom = DOMDocument::loadHTML($path2); 
echo $dom->getElementsByTagName('span')[0]->getAttribute('data-id'); 
Verwandte Themen