简体   繁体   中英

Split string before characters

PHP. How could I split this string into 5 strings.

Tampa Bay 6 Florida 5 (FINAL - OT)

The string that generates this result is $results[$sport][$p] .


I want to split that before the first number into $team1

Split the number into $team1score

Split the text after first number and before second number into $team2

Split the second number into $team2score

And finally split whats in the parentheses into $results


It is important not to use the spaces for splitting because some team names have multiple spaces.

Any help? Looks complicated but it is probably easy for the right person.

Some other useful info.

I'm trying to convert 2 scripts into PHP. The 2 below do the same thing but luckily for me there is no PHP version. Here is the windows mobile one below. It' an MSCR file

msg = "[scores]^NL^"
did = 0
hidewaitcursor
stream = readfile(url)

foreach entry in split(stream, "&nfl", 0)
if (find(entry, "s_left") ne "0")
entry = replace(entry,"%20"," ")
split(entry, "=", 1, a, b)

if (find(entry," at ") ne "0")
if (did eq "0")
msg = msg & "^NL^^NL^[schedule]^NL^"
did = 1
endif
split(b, " at ", 1, team1, team2)
split(team2, "(", 1, team2, info)
split(info, ")", 1, info, j)
else
split(b, " ", 1, team1, b)
split(b, "(", 1, team2, info)
split(info, ")", 1, info, j)
endif

if (find(team2,"^") ne "0")
tmp = team1
team1 = team2
team2 = tmp
endif

team1 = replace(team1,"^","")
team2 = replace(team2,"^","")
info = replace(info,"FINAL","final")

msg = msg & team1 & " - " & team2 & " -- " & info & "^NL^"

Here is a CodeFusuion script that does the same thing as the MSCR

<!--- Lets do NFL --->    
<cfset espn = "http://sports.espn.go.com/nfl/bottomline/scores">

<cfhttp url="#espn#" method="get" resolveurl="yes" throwonerror="yes" />
<cfset myArray = arrayNew(1) />
<cfset myResult = #CFHTTP.FileContent# />

<cfif ShowNFLEspnString EQ true>
    <cfoutput>
    <br />
    ESPN NFL String URL: <a href="#espn#">#espn#</a><br />
    <br />
    #myResult#<br />
    <br />
    </cfoutput>
</cfif>

<cfset j = 1 />
<!---parse the urls, don't touch :)--->
<cfset newResult = #REReplace(myResult, "%20%20", "@", "all")# />
<cfset newResult = #REReplace(newResult, "%20", " ", "all")# />
<cfset newResult = #REReplace(newResult, "%26", "", "all")# />
<cfset newResult = #REReplace(newResult, "[(][0-9][)]", "", "all")# />
<cfset newResult = #REReplace(newResult, "[(][0-9][0-9][)]", "", "all")# />
<cfset newResult = #REReplace(newResult, "[(][A-Z][A-Z][)]", "", "all")# />
<cfset newResult = #REReplace(newResult, "\^", "", "all")# />
<cfset newResult = #REReplace(newResult, "[ \t][a-z][a-z][ \t]", "@", "all")# />
<cfset newResult = #REReplace(newResult, "[(]", "@(", "all")# />
<cfset newResult = #REReplace(newResult, "[()]", "", "all")# />

<!---loop over the urls and store the teams in a array--->
<cfloop list="#newResult#" index="i" delimiters="#chr(38)#">
    <!--- Sometimes espn has a item with no teams or scores --->
    <!--- If this is the case, a try catch will keep the loop going so it doesn't crash --->
    <cftry>
        <cfset myArray[j] = listgetat("#i#", 2, "=") />
        <cfset j = j + 1 />
    <cfcatch>
        <!--- Don't care what the extra garbage is --->
    </cfcatch>
    </cftry>
</cfloop>

<cfset gamesArray = arrayNew(1) />
<cfset j = 1 />

<cfloop from="3" to="#arraylen(myArray)#" index="m" step="3">
    <cfset gamesArray[j] = #myArray[m]# & "&"  />
    <cfset j =  j + 1 />
</cfloop>

<!---remove garbage character at the end of the array--->
<cfset delete = #arrayDeleteAt(gamesArray, j-1)# />

<!---turn the array back into a list for fun :)--->
<cfset breakUp = #arrayToList(gamesArray,"")# />
<cfset matchArray = arrayNew(1) />
<cfloop list="#breakUp#" index="z" delimiters="#chr(38)#">
    <cftry>
        <cfset matchup = structNew() />
        <cfset matchup.teamOne = trim(listgetat("#z#", 1, "@")) />

        <!--- Get the score start and end places --->
        <cfset teamOneScoreStringStart = #findoneof("0123456789",matchup.teamOne)#>
        <cfset teamOneScoreStringEnd = #LEN(matchup.teamOne)#>

        <!--- Team 1 Score --->
        <cfif teamOneScoreStringStart EQ 0>
            <cfset matchup.teamOneScore = 0>
        <cfelse>
            <cfset matchup.teamOneScore =#Mid(matchup.teamOne,teamOneScoreStringStart,teamOneScoreStringEnd)#>
        </cfif>
        <!--- Remove Score from teamOne String --->
        <cfif teamOneScoreStringStart NEQ 0>
            <cfset teamOneScoreStringStart = teamOneScoreStringStart - 1>
            <cfset matchup.teamOne = #Mid(matchup.teamOne,1,teamOneScoreStringStart)#>
        </cfif> 

        <cfset matchup.teamTwo = trim(listgetat("#z#", 2, "@")) />

        <!--- Get the score start and end places --->
        <cfset teamTwoScoreStringStart = #findoneof("0123456789",matchup.teamTwo)#>
        <cfset teamTwoScoreStringEnd = #LEN(matchup.teamTwo)#>

        <!--- Team 2 Score --->
        <cfif teamTwoScoreStringStart EQ 0>
            <cfset matchup.teamTwoScore = 0>
        <cfelse>
            <cfset matchup.teamTwoScore =#Mid(matchup.teamTwo,teamTwoScoreStringStart,teamTwoScoreStringEnd)#>
        </cfif>
        <!--- Remove Score from teamTwo String --->
        <cfif teamTwoScoreStringStart NEQ 0>
            <cfset teamTwoScoreStringStart = teamTwoScoreStringStart - 1>
            <cfset matchup.teamTwo = #Mid(matchup.teamTwo,1,teamTwoScoreStringStart)#>
        </cfif> 

        <cfset matchup.matchDate = trim(listgetat("#z#", 3, "@")) />

    <cfcatch>
        <!--- Don't care, just make sure it doesn't crash --->
    </cfcatch>
    </cftry>

    <cfset arrayAppend(matchArray,matchup) />

</cfloop>

<!--- LETS SEE OUR LIVE SCORES!!!! --->
<cfif ShowGameDump EQ true>
    <cfdump var="#matchArray#" />
</cfif>    

<!--- Ok lets do something with our live scores, loop through the array and add total score --->
<!--- This will be our new array to hold our information --->
<cfset matchInfoArray = arrayNew(1)>                
<cfloop from="1" to="#arraylen(matchArray)#" index="i">

    <cfset matchupinfo = structNew() />

    <!--- Set MATCHDATE --->
    <cfset matchupinfo.matchdate = matchArray[i].matchdate>

    <!--- Set TOTAL POINTS --->
    <cfif isnumeric(matchArray[i].teamonescore) AND isnumeric(matchArray[i].teamtwoscore)>
        <cfset matchupinfo.total = (matchArray[i].teamonescore + matchArray[i].teamtwoscore)>
    <cfelse>
        <cfset matchupinfo.total = 0>
    </cfif>

    <!--- Set TEAM ONE --->
    <cfset matchupinfo.teamOne = matchArray[i].teamOne />

    <!--- Set TEAM ONE SCORE --->
    <cfset matchupinfo.teamOneScore = matchArray[i].teamonescore />

    <!--- Set TEAM TWO --->
    <cfset matchupinfo.teamTwo = matchArray[i].teamTwo />

    <!--- Set TEAM ONE SCORE --->
    <cfset matchupinfo.teamTwoScore = matchArray[i].teamtwoscore />

    <!--- Add game info to the array --->
    <cfset arrayAppend(matchInfoArray,matchupinfo) />

</cfloop>

<cfif ShowPassFail EQ true>
    <font size="2" style="color:green;">Live Scoring Template Updated Successfully </font><br /><br /><br /><br />
</cfif>    
<cfset variables.UpdatePassed = true>

<cfcatch type="any">
    <!--- If something went wrong, lets let display an error message and dump the catch --->
    <cfif ShowPassFail EQ true>
        <font size="2" style="color:red;">Live Scoring Template Failed to Update </font><br />
    </cfif>    
    <cfset variables.UpdatePassed = false>
    <cfdump var="#cfcatch#">
</cfcatch>

</cftry>


<!--- Lets make the display a little nicer :) --->
<table width="100%" border="1">

<tr align="center">
    <td>
        Team 1
    </td>
    <td>
        Game Info
    </td>
    <td>
        Team 2
    </td>
</tr>

<cfloop from="1" to="#arraylen(matchInfoArray)#" index="i">

<cfoutput>

    <tr>
        <td width="40%" align="left">
            <table border="0" width="100%">
                <tr>    
                    <td align="center" width="60%">
                        <font size="4">
                            #matchInfoArray[i].teamOne# 
                         </font>
                    </td>
                    <td align="right">
                        <font size="6">
                        #matchInfoArray[i].teamOneScore# &nbsp;
                        </font>
                    </td>
                </tr>
            </table>
        </td>
        <td width="20%" align="center">
            Total: #matchInfoArray[i].total#<br />
            #matchInfoArray[i].matchDate#
        </td>
        <td width="40%">
            <table border="0" width="100%">
                <tr>    
                    <td align="left">
                        <font size="6">
                            &nbsp;
                            #matchInfoArray[i].teamTwoScore#
                        </font>
                    </td>
                    <td align="center" width="60%">
                        <font size="4">
                            #matchInfoArray[i].teamTwo#
                        </font>
                    </td>
                </tr>
            </table>
        </td>
    </tr>
</cfoutput>
</cfloop>
</table>

You can use the preg_match() function

<?php
$string = "Tampa Bay 6 Florida 5 (FINAL - OT)";
$result;

preg_match("/^([^\d]+)(\d+)([^\d]+)(\d+)\s*(\(.*\))$/", $string, $result);

print_r($result);
?>

OUTPUT:

Array ( [0] => Tampa Bay 6 Florida 5 (FINAL - OT) [1] => Tampa Bay [2] => 6 [3] => Florida [4] => 5 [5] => (FINAL - OT) )

And you can use predefined column indexes:

$first_team = 1;
$first_team_score = 2;
$result[$first_team];
$result[$first_team_score];

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM