Sök och ersätt text i PowerPoint-presentationer i PHP
Översikt
Aspose.Slides for PHP via Java kan söka, markera och ersätta text i en enskild textruta eller i hela presentationen. Varje operation kan också meddela en applikation om varje träff via en resultat‑återuppringning. Detta möjliggör att uppdatera en presentation och samtidigt bygga ett granskningsspår som innehåller den matchade texten, dess kontext, position, textruta och bildnummer.
Dessa funktioner är användbara för granskning, redigering, terminologikontroller, mallrengöring och automatiserade rapporteringsarbetsflöden.
I de första exemplen nedan använder vi filen ”sample.pptx”, som innehåller en enda textruta på den första bilden med följande text:

Välj sökomfång
Använd metoder på TextFrame för att begränsa en operation till en textruta. Använd metoder på Presentation för att bearbeta all tillämplig text i presentationen.
| Operation | En textruta | Hela presentationen |
|---|---|---|
| Markera exakt text | TextFrame::highlightText | Presentation::highlightText |
| Markera reguljära uttryck | TextFrame::highlightRegex | Presentation::highlightRegex |
| Ersätt exakt text | TextFrame::replaceText | Presentation::replaceText |
| Ersätt reguljära uttryck | TextFrame::replaceRegex | Presentation::replaceRegex |
Konfigurera textmatchning
För exakt‑textoperationer, använd TextSearchOptions för att styra matchning:
- TextSearchOptions::setWholeWordsOnly begränsar träffar till hela ord.
- TextSearchOptions::setCaseSensitive styr om teckenkänslighet krävs.
- TextSearchOptions::setIncludeNotes inkluderar bildanteckningar i sök‑, ersättnings‑ och markeringsoperationer på presentationsnivå.
Reguljära‑uttrycksoperationer använder ett Java‑Pattern, så regler som teckenkänslighet och ordgränser definieras av uttrycket och dess flaggor.
Samla matchningsinformation med en återuppringning
Skicka en Java‑proxy‑återuppringning till en markerings‑ eller ersättningsmetod för att få en avisering för varje träff. Återuppringningsmetoden får den relaterade textrutan, källtexten, den matchade texten och matchningspositionen.
Återuppringningen får inte bildnumret direkt. Implementeringen nedan härleder det från den överordnade bilden och hanterar också text som finns i bildanteckningar. Resultat‑arrayen använder null när text är kopplad till en annan bildtyp.
class TextSearchCallback {
private $results = [];
public function getResults() {
return $this->results;
}
public function foundResult($textFrame, $sourceText, $foundText, $textPosition) {
$slideNumber = $this->getSlideNumber($textFrame);
$this->results[] = [
"textFrame" => $textFrame,
"sourceText" => java_values($sourceText),
"foundText" => java_values($foundText),
"textPosition" => java_values($textPosition),
"slideNumber" => $slideNumber
];
}
private function getSlideNumber($textFrame) {
$parentSlide = $textFrame->getSlide();
if (java_is_null($parentSlide)) {
return null;
}
$parentSlideClass = $parentSlide->getClass();
$classNameValue = $parentSlideClass->getName();
$className = java_values($classNameValue);
if ($className === "com.aspose.slides.Slide") {
$slideNumber = $parentSlide->getSlideNumber();
return java_values($slideNumber);
}
if ($className === "com.aspose.slides.NotesSlide") {
$slide = $parentSlide->getParentSlide();
$slideNumber = $slide->getSlideNumber();
return java_values($slideNumber);
}
return null;
}
}
Skapa en proxy för detta PHP‑objekt innan du skickar det till en operation:
$callbackHandler = new TextSearchCallback();
$callbackInterface = java("com.aspose.slides.IFindResultCallback");
$callback = java_closure(
$callbackHandler,
null,
$callbackInterface
);
För ersättningsoperationer innehåller foundText den ursprungliga matchade texten, så återuppringningen kan registrera exakt vilka termer som ersattes.
Markera text
Använd metoden TextFrame::highlightText för att markera exakt‑textträffar i en textruta. Skicka TextSearchOptions för att styra sökningen.
Kodexemplet nedan markerar alla förekomster av tecknen “try” och markerar sedan endast hela ordet “to”.
$presentation = new Presentation("sample.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->get_Item(0);
$callbackHandler = new TextSearchCallback();
$callbackInterface = java("com.aspose.slides.IFindResultCallback");
$callback = java_closure(
$callbackHandler,
null,
$callbackInterface
);
$substringSearchOptions = new TextSearchOptions();
$substringSearchOptions->setCaseSensitive(false);
$substringHighlightColor = new Java("java.awt.Color", 173, 216, 230);
// Markera varje förekomst av "try" i textrutan.
$shape->getTextFrame()->highlightText(
"try",
$substringHighlightColor,
$substringSearchOptions,
$callback
);
$wholeWordSearchOptions = new TextSearchOptions();
$wholeWordSearchOptions->setWholeWordsOnly(true);
$wholeWordSearchOptions->setCaseSensitive(false);
$wholeWordHighlightColor = new Java("java.awt.Color", 238, 130, 238);
// Markera endast hela ordet "to".
$shape->getTextFrame()->highlightText(
"to",
$wholeWordHighlightColor,
$wholeWordSearchOptions,
$callback
);
foreach ($callbackHandler->getResults() as $result) {
echo(
"Found '" . $result["foundText"] . "' at position " .
$result["textPosition"] . " on slide " .
$result["slideNumber"] . ".\n"
);
}
$presentation->save("highlighted_text.pptx", SaveFormat::Pptx);
}
finally {
$presentation->dispose();
}
Resultatet:

Markera text med reguljära uttryck
Metoden TextFrame::highlightRegex markerar textträffar som hittas med ett reguljärt uttryck i en textruta.
Följande kod markerar alla ord som innehåller sju eller fler tecken:
$presentation = new Presentation("sample.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->get_Item(0);
$regex = java("java.util.regex.Pattern")->compile("\\b[^\\s]{7,}\\b");
$highlightColor = java("java.awt.Color")->YELLOW;
$shape->getTextFrame()->highlightRegex($regex, $highlightColor, null);
$presentation->save("highlighted_text_using_regex.pptx", SaveFormat::Pptx);
}
finally {
$presentation->dispose();
}
Resultatet:

Markera text i hela presentationen
Använd Presentation::highlightText och Presentation::highlightRegex för att söka i alla tillämpliga textrutor i en presentation. Följande exempel markerar ett exakt uttryck och alla e‑postadresser:
$presentation = new Presentation("presentation.pptx");
try {
$searchOptions = new TextSearchOptions();
$searchOptions->setWholeWordsOnly(true);
$searchOptions->setCaseSensitive(false);
$termHighlightColor = java("java.awt.Color")->ORANGE;
$presentation->highlightText(
"confidential",
$termHighlightColor,
$searchOptions,
null
);
$patternClass = java("java.util.regex.Pattern");
$emailPattern = "\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b";
$emailRegex = $patternClass->compile(
$emailPattern,
$patternClass->CASE_INSENSITIVE
);
$emailHighlightColor = java("java.awt.Color")->YELLOW;
$presentation->highlightRegex($emailRegex, $emailHighlightColor, null);
$presentation->save("highlighted_presentation.pptx", SaveFormat::Pptx);
}
finally {
$presentation->dispose();
}
Ersätt text i en textruta
Använd TextFrame::replaceText för exakt text och TextFrame::replaceRegex för mönsterbaserad ersättning. Dessa metoder uppdaterar den matchade texten i den befintliga textrutan, vilket bevarar den omgivande formateringen istället för att bygga om textrutan från en ren sträng.
Följande exempel standardiserar en stavningsvariant och ersätter sedan versionsetiketter:
$presentation = new Presentation("presentation.pptx");
try {
$slide = $presentation->getSlides()->get_Item(0);
$shape = $slide->getShapes()->get_Item(0);
$searchOptions = new TextSearchOptions();
$searchOptions->setWholeWordsOnly(true);
$searchOptions->setCaseSensitive(false);
$shape->getTextFrame()->replaceText(
"colour",
"color",
$searchOptions,
null
);
$patternClass = java("java.util.regex.Pattern");
$versionPattern = "\\bv\\d+(?:\\.\\d+)*\\b";
$versionRegex = $patternClass->compile(
$versionPattern,
$patternClass->CASE_INSENSITIVE
);
$shape->getTextFrame()->replaceRegex(
$versionRegex,
"current version",
null
);
$presentation->save("updated_text_frame.pptx", SaveFormat::Pptx);
}
finally {
$presentation->dispose();
}
Om en träff sträcker sig över delar med olika formatering, granska utdata för att bekräfta vilken formatering som ska gälla för den ersatta texten.
Ersätt text i hela presentationen
Använd Presentation::replaceText och Presentation::replaceRegex för att tillämpa samma operationer i hela presentationen. Detta är användbart för mallrengöring, terminologiska uppdateringar och redigering.
$presentation = new Presentation("presentation.pptx");
try {
$searchOptions = new TextSearchOptions();
$searchOptions->setWholeWordsOnly(true);
$searchOptions->setCaseSensitive(true);
$presentation->replaceText(
"Contoso",
"Example Corp",
$searchOptions,
null
);
$accountNumberRegex = java("java.util.regex.Pattern")->compile(
"\\bACCT-\\d{6}\\b"
);
$presentation->replaceRegex(
$accountNumberRegex,
"ACCT-REDACTED",
null
);
$presentation->save("updated_presentation.pptx", SaveFormat::Pptx);
}
finally {
$presentation->dispose();
}
Gruppera matchningar för rapportering
Eftersom varje resultat sparar sitt bildnummer och sin textruta kan applikationer gruppera matchningar för revision, rapportering eller granskningsarbetsflöden. Följande exempel grupperar de insamlade resultaten först efter bild och sedan efter textruta:
$matchesBySlide = [];
$systemClass = java("java.lang.System");
foreach ($callbackHandler->getResults() as $result) {
$slideNumber = $result["slideNumber"];
$slideLabel = $slideNumber === null ? "Other" : (string) $slideNumber;
$textFrame = $result["textFrame"];
$textFrameHash = $systemClass->identityHashCode($textFrame);
$textFrameKey = (string) java_values($textFrameHash);
if (!isset($matchesBySlide[$slideLabel])) {
$matchesBySlide[$slideLabel] = [];
}
if (!isset($matchesBySlide[$slideLabel][$textFrameKey])) {
$matchesBySlide[$slideLabel][$textFrameKey] = [
"textFrame" => $textFrame,
"matches" => []
];
}
$matchesBySlide[$slideLabel][$textFrameKey]["matches"][] = $result;
}
foreach ($matchesBySlide as $slideLabel => $textFrameGroups) {
echo("Slide: " . $slideLabel . "\n");
foreach ($textFrameGroups as $textFrameGroup) {
$textFrame = $textFrameGroup["textFrame"];
echo(" Text frame: " . $textFrame->getText() . "\n");
foreach ($textFrameGroup["matches"] as $result) {
echo(
" '" . $result["foundText"] . "' at position " .
$result["textPosition"] . "; context: '" .
$result["sourceText"] . "'\n"
);
}
}
}
FAQ
Hur kan jag söka i endast en textruta istället för hela presentationen?
Hämta formens textruta och anropa TextFrame::highlightText, TextFrame::highlightRegex, TextFrame::replaceText eller TextFrame::replaceRegex på den textrutan. Metoder på presentationsnivå bearbetar alla tillämpliga textrutor istället.
Hur kan jag matcha hela ord med korrekt versalisering?
Sätt TextSearchOptions::setWholeWordsOnly och TextSearchOptions::setCaseSensitive till true och skicka alternativen till en exakt‑textmarkerings‑ eller ersättningsmetod. För reguljära uttryck definierar du ordgränser och teckenkänslighet i själva Java‑Pattern.
Kan sök och ersättning inkludera text i bildanteckningar?
Ja. Sätt TextSearchOptions::setIncludeNotes till true när du använder en exakt‑textoperation på presentationsnivå.
Hur kan jag skapa en rapport utan att skanna presentationen en andra gång?
Skicka en Java‑proxy‑återuppringning till markerings‑ eller ersättningsoperationen. Den får varje träff medan operationen körs, så applikationen kan lagra källtext, matchad text, position, textruta och härlett bildnummer för senare gruppering eller export.
Bevarar ersättning av text dess formatering?
TextFrame::replaceText och TextFrame::replaceRegex ändrar den matchade texten i den befintliga textrutan och behåller formateringen i de omgivande delarna. Om en träff sträcker sig över delar med olika formatering, inspektera resultatet för att säkerställa att ersättningen använder önskad stil.