Wyszukiwanie i zamiana tekstu w prezentacjach PowerPoint w PHP
Przegląd
Aspose.Slides for PHP via Java może wyszukiwać, podświetlać i zamieniać tekst w pojedynczej ramce tekstowej lub w całej prezentacji. Każda operacja może także powiadomić aplikację o każdym dopasowaniu za pomocą wywołania zwrotnego wyniku. Dzięki temu można zaktualizować prezentację i jednocześnie tworzyć ślad audytu zawierający dopasowany tekst, jego kontekst, pozycję, ramkę tekstową i numer slajdu.
Te możliwości są przydatne przy przeglądzie, redakcji, kontroli terminologii, czyszczeniu szablonów oraz automatycznych procesach raportowania.
W pierwszych przykładach używamy pliku o nazwie “sample.pptx”, który zawiera jedną ramkę tekstową na pierwszym slajdzie z następującym tekstem:

Wybór zakresu wyszukiwania
Użyj metod na TextFrame aby ograniczyć operację do jednej ramki tekstowej. Użyj metod na Presentation aby przetworzyć cały tekst w prezentacji.
| Operacja | Jedna ramka tekstowa | Cała prezentacja |
|---|---|---|
| Podświetlanie dosłownego tekstu | TextFrame::highlightText | Presentation::highlightText |
| Podświetlanie dopasowań wyrażeniem regularnym | TextFrame::highlightRegex | Presentation::highlightRegex |
| Zamiana dosłownego tekstu | TextFrame::replaceText | Presentation::replaceText |
| Zamiana dopasowań wyrażeniem regularnym | TextFrame::replaceRegex | Presentation::replaceRegex |
Konfigurowanie dopasowywania tekstu
Dla operacji na tekście dosłownym użyj TextSearchOptions aby kontrolować dopasowanie:
- TextSearchOptions::setWholeWordsOnly ogranicza dopasowania do pełnych słów.
- TextSearchOptions::setCaseSensitive określa, czy musi być zachowana wielkość znaków.
- TextSearchOptions::setIncludeNotes uwzględnia notatki slajdów w operacjach wyszukiwania, zamiany i podświetlania na poziomie prezentacji.
Operacje przy użyciu wyrażeń regularnych korzystają z klasy Java Pattern, więc reguły dopasowania takie jak wrażliwość na wielkość znaków i granice słów są definiowane w wyrażeniu i jego flagach.
Zbieranie informacji o dopasowaniach przy pomocy wywołania zwrotnego
Przekaż proxy wywołania zwrotnego Java do metody podświetlania lub zamiany, aby otrzymać powiadomienie o każdym dopasowaniu. Metoda wywołania zwrotnego otrzymuje powiązaną ramkę tekstową, źródłowy tekst, dopasowany tekst oraz pozycję dopasowania.
Wywołanie zwrotne nie otrzymuje numeru slajdu bezpośrednio. Implementacja poniżej wyprowadza go z rodzica slajdu i obsługuje również tekst znaleziony w notatkach slajdu. Tablica wyników używa null, gdy tekst jest powiązany z innym typem slajdu.
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;
}
}
Utwórz proxy dla tego obiektu PHP przed przekazaniem go do operacji:
$callbackHandler = new TextSearchCallback();
$callbackInterface = java("com.aspose.slides.IFindResultCallback");
$callback = java_closure(
$callbackHandler,
null,
$callbackInterface
);
W operacjach zamiany foundText zawiera oryginalny dopasowany tekst, więc wywołanie zwrotne może dokładnie zarejestrować, które wyrażenia zostały zamienione.
Podświetlanie tekstu
Użyj metody TextFrame::highlightText, aby podświetlić dosłowne dopasowania tekstu w ramce tekstowej. Przekaż TextSearchOptions aby kontrolować wyszukiwanie.
Przykład kodu poniżej podświetla wszystkie wystąpienia ciągu “try”, a następnie podświetla tylko całe słowo “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);
// Podświetl każde wystąpienie "try" w ramce tekstowej.
$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);
// Podświetl tylko całe słowo "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();
}
Wynik:

Podświetlanie tekstu przy użyciu wyrażeń regularnych
Metoda TextFrame::highlightRegex podświetla dopasowania znalezione przez wyrażenie regularne w ramce tekstowej.
Poniższy kod podświetla wszystkie słowa zawierające siedem lub więcej znaków:
$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();
}
Wynik:

Podświetlanie tekstu w całej prezentacji
Użyj Presentation::highlightText oraz Presentation::highlightRegex, aby przeszukać wszystkie odpowiednie ramki tekstowe w prezentacji. Poniższy przykład podświetla dosłowne wyrażenie oraz wszystkie adresy e‑mail:
$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();
}
Zamiana tekstu w ramce tekstowej
Użyj TextFrame::replaceText dla tekstu dosłownego i TextFrame::replaceRegex dla zamiany opartej na wzorcu. Metody te aktualizują dopasowany tekst wewnątrz istniejącej ramki, zachowując formatowanie otaczających fragmentów zamiast odtwarzać ramkę z czystego ciągu znaków.
Poniższy przykład ujednolica wariant pisowni, a następnie zamienia etykiety wersji:
$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();
}
Jeśli jedno dopasowanie obejmuje fragmenty o różnym formatowaniu, sprawdź wynik, aby potwierdzić, które formatowanie powinno zostać zastosowane do tekstu zamiany.
Zamiana tekstu w całej prezentacji
Użyj Presentation::replaceText i Presentation::replaceRegex, aby zastosować te same operacje w całej prezentacji. Jest to przydatne przy czyszczeniu szablonów, aktualizacji terminologii i redakcji.
$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();
}
Grupowanie dopasowań do raportowania
Ponieważ każdy wynik przechowuje numer slajdu i ramkę tekstową, aplikacje mogą grupować dopasowania w celu audytu, raportowania lub przeglądu. Poniższy przykład grupuje zebrane wyniki najpierw według slajdu, a potem według ramki tekstowej:
$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
Jak mogę przeszukać tylko jedną ramkę tekstową zamiast całej prezentacji?
Pobierz ramkę tekstową kształtu i wywołaj TextFrame::highlightText, TextFrame::highlightRegex, TextFrame::replaceText lub TextFrame::replaceRegex na tej ramce. Metody na poziomie prezentacji przetwarzają wszystkie odpowiednie ramki tekstowe.
Jak dopasować pełne słowa z zachowaniem prawidłowej wielkości liter?
Ustaw TextSearchOptions::setWholeWordsOnly i TextSearchOptions::setCaseSensitive na true i przekaż opcje do metody podświetlania lub zamiany tekstu dosłownego. Dla wyrażeń regularnych określ granice słów i wrażliwość na wielkość liter bezpośrednio w klasie Java Pattern.
Czy wyszukiwanie i zamiana mogą obejmować tekst w notatkach slajdu?
Tak. Ustaw TextSearchOptions::setIncludeNotes na true przy używaniu operacji dosłownego tekstu na poziomie prezentacji.
Jak stworzyć raport bez ponownego skanowania prezentacji?
Przekaż wywołanie zwrotne proxy Java do operacji podświetlania lub zamiany. Otrzyma ono każde dopasowanie w trakcie wykonywania operacji, dzięki czemu aplikacja może zapisać źródłowy tekst, dopasowany tekst, pozycję, ramkę tekstową oraz wyprowadzony numer slajdu do późniejszego grupowania lub eksportu.
Czy zamiana tekstu zachowuje jego formatowanie?
TextFrame::replaceText i TextFrame::replaceRegex modyfikują dopasowany tekst wewnątrz istniejącej ramki i zachowują formatowanie otaczających fragmentów. Jeśli dopasowanie obejmuje fragmenty o różnym formatowaniu, należy sprawdzić wynik, aby upewnić się, że zamiana używa pożądanego stylu.